我知道基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为什么这里准确地表示了它?
发布于 2015-02-17 07:04:55
从Python2.7和3.1开始,Python使用最短的表示来显示浮点数,在计算时得到相同的浮点数。来自文档
Python现在使用David的算法来查找不改变其值的最短浮点表示。这将有助于缓解围绕二进制浮点数的一些混淆。 像
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仍然是一种情况,尽管表示形式可能会提出相反的建议。 新算法依赖于底层浮点实现中的某些特征。如果找不到所需的特征,则将继续使用旧的算法。同时,利用原有的算法,保证了跨平台的可移植性.
https://stackoverflow.com/questions/28556302
复制相似问题