我知道以2为底的机器不能准确地表示某些以10为底的值,例如1/10。我已经看到了使用Python本身的示例。在我的机器上:
Python 2.7.8 (default, Oct 18 2014, 12:50:18)
[GCC 4.9.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 1.0/10
0.1
为什么在这里准确地表示?
从Python 2.7和3.1开始,Python使用最短的表示形式显示浮点数,该最短表示在求值时会产生相同的浮点数。从文档中:
Python现在使用David Gay的算法来查找不会更改其值的最短浮点表示形式。这应该有助于减轻围绕二进制浮点数的一些困惑。
用类似
1.1
这样的数字很容易看出其重要性,该数字在二进制浮点数中没有确切的等价物。由于没有精确的等价项,因此像这样的表达式的float('1.1')
计算结果是最接近的可表示值,0x1.199999999999ap+0
以十六进制或1.100000000000000088817841970012523233890533447265625
十进制表示。该最接近的值曾经且仍在以后的浮点计算中使用。新功能是显示数字的方式。以前,Python使用一种简单的方法。的值
repr(1.1)
被计算为format(1.1, '.17g')
其中评价'1.1000000000000001'
。使用17位数字的优点是它依靠IEEE-754保证来确保eval(repr(1.1))
准确地往返于其原始值。缺点是许多人发现输出令人困惑(将二进制浮点表示的固有限制误认为是Python本身的问题)。的新算法
repr(1.1)
更智能,并且返回'1.1'
。有效地,它搜索所有等效的字符串表示形式(使用相同的基础浮点值存储的字符串表示形式),并返回最短的表示形式。新算法倾向于在可能的情况下发出更清晰的表示,但它不会更改基础值。因此,
1.1 + 2.2 != 3.3
即使这些表示可能暗示其他情况,仍然是这种情况。新算法取决于基础浮点实现中的某些功能。如果找不到所需的功能,则将继续使用旧算法。而且,文本pickle协议通过使用旧算法来确保跨平台的可移植性。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句