为数据类型分配的默认内存是否在舍入中起作用?如果浮点数超过分配的内存,浮点数将以什么方式舍入?

时间:2018-05-05 07:31:54

标签: python-3.x floating-point rounding

拥有包含以下内容的文件test2.py:

print(2.0000000000000003)    
print(2.0000000000000002)

我得到了这个输出:

$ python3 test2.py  

2.0000000000000004  
2.0    

我认为为float分配的内存不足可能导致这种情况,但2.0000000000000003和2.0000000000000002需要相同的内存量。

2 个答案:

答案 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