Zen*_*Zen 0 python floating-point floating-accuracy ieee-754
我知道这些是浮点分割.但为什么这两个公式表现不同?
我做了一些调查,结果使我更加困惑:
>>>0.9/3
0.3
>>>1.2/3
0.39999999999999997
>>>1.5/3
0.5
Run Code Online (Sandbox Code Playgroud)
这里用什么逻辑来决定结果是用小数点后一位打印还是更多?
PS:我用python3.4做了上面的实验.
因为浮点结果的确切值略有不同.
>>> '%.56f' % 0.4
'0.40000000000000002220446049250313080847263336181640625000'
>>> '%.56f' % (0.4/2)
'0.20000000000000001110223024625156540423631668090820312500'
>>> '%.56f' % 0.6
'0.59999999999999997779553950749686919152736663818359375000'
>>> '%.56f' % (0.6/3)
'0.19999999999999998334665463062265189364552497863769531250'
>>> '%.56f' % 0.2
'0.20000000000000001110223024625156540423631668090820312500'
>>> (0.2 - 0.6/3) == 2.0**-55
True
Run Code Online (Sandbox Code Playgroud)
如您所见,打印为"0.2"的结果确实略微接近0.2.我在最后添加了这个位,以显示这两个数字之间差异的确切值.(如果你很好奇,上面的表示是准确的值 - 添加任何数字以外的数字只会增加更多的零).
最具体的:
有趣的是,有许多不同的十进制数,它们具有相同的最接近的近似二进制分数.例如,数字0.1和0.10000000000000001和0.1000000000000000055511151231257827021181583404541015625都近似为3602879701896397/2**55.由于所有这些十进制值共享相同的近似值,因此可以显示其中任何一个,同时仍保留不变eval(repr(x) )== x.
从历史上看,Python提示符和内置的repr()函数将选择具有17位有效数字的0.10000000000000001.从Python 3.1开始,Python(在大多数系统上)现在能够选择最短的这些并且只显示0.1.
| 归档时间: |
|
| 查看次数: |
1238 次 |
| 最近记录: |