Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
代表1/10的Python_Python_Floating Accuracy - Fatal编程技术网

代表1/10的Python

代表1/10的Python,python,floating-accuracy,Python,Floating Accuracy,我知道基数为2的机器无法准确表示某些基数为10的值,例如1/10。我见过一些例子。在我的机器上: 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 为什么要在这里精确地表示它?从Python2.7和3.1开始,Pytho

我知道基数为2的机器无法准确表示某些基数为10的值,例如1/10。我见过一些例子。在我的机器上:

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

为什么要在这里精确地表示它?

从Python2.7和3.1开始,Python使用最短的表示法来显示浮点数,计算时会得到相同的浮点数。从:

Python现在使用David Gay的算法来寻找不改变其值的最短浮点表示。这将有助于减轻围绕二进制浮点数的一些混淆

用像
1.1
这样的数字很容易看出其重要性,它在二进制浮点中没有精确的等价物。由于没有完全等效的表达式,像
float('1.1')
这样的表达式计算为最接近的可表示值,即十六进制形式的
0x1.199999999AP+0
,或十进制形式的
1.1000000000000088817841970012523233890533447265625
。该最近值过去和现在都在后续浮点计算中使用

新的是数字的显示方式。以前,Python使用一种简单的方法。
repr(1.1)
的值被计算为
格式(1.1,.17g')
,计算结果为
'1.10000000000001'
。使用17位数字的优势在于,它依赖IEEE-754保证,以确保
eval(repr(1.1))
将精确往返到其原始值。缺点是许多人发现输出令人困惑(误认为二进制浮点表示的固有限制是Python本身的问题)

repr(1.1)
的新算法更智能,返回
'1.1'
。实际上,它搜索所有等价的字符串表示形式(使用相同的基础浮点值存储的字符串表示形式),并返回最短的表示形式

新算法在可能的情况下倾向于发出更清晰的表示,但它不会更改基础值。因此,
1.1+2.2!=3.3
即使陈述可能另有建议

新算法依赖于底层浮点实现中的某些特性。如果没有找到所需的特征,将继续使用旧算法。此外,文本pickle协议通过使用旧算法来确保跨平台的可移植性


因为这是假的<代码>>>>'{.30f}'。格式(1./10)
'0.10000000000000055115123126'
相关: