拥有包含以下内容的文件test2.py:
print(2.0000000000000003)
print(2.0000000000000002)
我得到了这个输出:
$ python3 test2.py
2.0000000000000004
2.0
我认为为float分配的内存不足可能导致这种情况,但2.0000000000000003和2.0000000000000002需要相同的内存量。
答案 0 :(得分:1)
IEEE 754 64位二进制浮点始终使用64位来存储数字。它可以精确地表示二进制分数的有限子集。仅查看正常数字,如果N
在其范围内是2的幂,则它可以表示形式的数字,以二进制形式1.s*N
,其中s
是52的字符串零和一。
所有32位二进制整数,包括2,都是完全可表示的。
大于2的最小可精确表示的数字是2.000000000000000444089209850062616169452667236328125。它是二进制分数的两倍1.00000000000000000000000000000000000000000000000000000001。
2.0000000000000003接近2.000000000000000444089209850062616169452667236328125而不是2,因此它会向上舍入并打印为2.0000000000000004。
2.0000000000000002更接近2.0,因此它向下舍入到2.0。
要存储介于2.0和2.000000000000000444089209850062616169452667236328125之间的数字,需要使用不同的浮点格式,每个数字可能需要超过64位。
答案 1 :(得分:0)
浮点数不会以整数形式存储,每个位都标有1,2,4,8,16,32,...的是/否项,用于得到完整数字。它们在基数2中存储为sign
+ mantissa
+ exponent
。有几种组合具有特殊含义(NaN,+ -inf,-0,...)。正数和负数在尾数和指数中是唯一的,只有符号不同。
在任何时候他们都有a specific bit-length他们被“投入”。它们无法溢出。
然而,如果你试图将数字放入其中需要更高的准确度,你会得到舍入错误,那么它们的准确度很低 - 这就是你在例子中看到的。有关浮动和存储的更多信息(带示例):
有关花车准确性的更多信息: - Floating Point Arithmetic: Issues and Limitations