一尘不染

如何在浮点算术和十进制中表示0.1

c#

我试图更好地理解浮点算术,并看到了一些链接到“每个计算机科学家应该了解的浮点算术”。

我仍然不明白如何将类似0.1或的数字0.5以浮点数和小数形式存储。

有人可以解释一下记忆的布局方式吗?

我知道浮子有两个部分(即,某种力量的数字)。


阅读 473

收藏
2020-05-19

共1个答案

一尘不染

我一直向人们推荐Harald
Schmidt的在线转换器
,以及带有漂亮图片的Wikipedia
IEEE754-1985文章

对于这两个特定值,您得到(对于0.1):

s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm    1/n
0 01111011 10011001100110011001101
           |  ||  ||  ||  ||  || +- 8388608
           |  ||  ||  ||  ||  |+--- 2097152
           |  ||  ||  ||  ||  +---- 1048576
           |  ||  ||  ||  |+-------  131072
           |  ||  ||  ||  +--------   65536
           |  ||  ||  |+-----------    8192
           |  ||  ||  +------------    4096
           |  ||  |+---------------     512
           |  ||  +----------------     256
           |  |+-------------------      32
           |  +--------------------      16
           +-----------------------       2

标志是积极的,这很容易。

指数为64+32+16+8+2+1 = 123 - 127 bias = -4,因此乘数为或。2-4``1/16

尾数很矮。它由1(隐式碱)加(用于与每个值所有那些比特如在开始和向右增加), 。1/(2n)``n``1``{1/2, 1/16, 1/32, 1/256, 1/512, 1/4096, 1/8192, 1/65536, 1/131072, 1/1048576, 1/2097152, 1/8388608}

将所有这些相加后,您将得到1.60000002384185791015625

当您将其乘以乘数时,您会得到0.100000001490116119384765625,这就是为什么他们说您不能完全表示0.1为IEEE754浮点数,并且为回答"why doesn't 0.1 + 0.1 + 0.1 == 0.3?"类型问题的人们提供了很多SO机会:-)


0.5的示例要容易得多。它表示为:

s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm
0 01111110 00000000000000000000000

这意味着它是隐式基数,1再加上其他加法符(所有的尾数位均为零)。

标志再次为正。指数是64+32+16+8+4+2 = 126 - 127 bias = -1。因此,乘数为或。2-1``1/2``0.5

因此,最终值将1乘以0.50.5。瞧!


我有时发现用小数来表示它更容易。

数字1.345等于

1 + 3/10   + 4/100 + 5/1000

要么:

        -1       -2      -3
1 + 3*10   + 4*10  + 5*10

同样,IEEE754十进制表示形式为0.8125

s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm
0 01111110 10100000000000000000000

隐式基数为1,等效于二进制:

         01111110-01111111
1.101 * 2

要么:

                     -1
(1   + 1/2 + 1/8) * 2     (no 1/4 since that bit is 0)

变成:

(8/8 + 4/8 + 1/8) * 1/2

随后 变为:

13/8 * 1/2 = 0.8125
2020-05-19