打印输出中的36位补丁('%.70f'%(0.2 + 0.1))

问题描述 投票:0回答:1

我理解为什么0.1 + 0.2在Python 3中会产生这种情况:

>>> 0.1 + 0.2
0.30000000000000004

...但是我不明白为什么在下面显示的输出中间会有一个36位(大部分)非零数字的段:

>>> print('%.70f' % (0.2 + 0.1))
0.3000000000000000444089209850062616169452667236328125000000000000000000

我确实期望在0.1 + 0.2和二进制IEEE 754浮点数之间最接近0.1 + 0.2的差异,但是我不明白为什么这种差异会导致显示36位数字(相当于大约120位)精度)。

我可以理解该错误的精度是否更小(<53位),或者(视在)无限精度,这可能是由于评估'%.70f' % (0.2 + 0.1)的算法的伪像所致。但是我无法理解会导致上面显示的36位补丁程序的错误。

python floating-point ieee-754
1个回答
1
投票

您正在使用的Python实现显然将IEEE-754 binary64用于浮点。 (这很常见,但是Python并未强制执行。)

以这种格式,数字表示为2的幂的倍数,其中所使用的2的特定幂取决于数字的大小。 (浮点格式还以其他与数学上等效的方式进行了描述,例如使用具有固定数量的小数位的有效数字,而不是我在此处使用的整数倍。此描述在以下位置更易于解释手)。

对于.3附近的数字,使用的2的幂为2 -54。四舍五入为浮点格式后,将.1.2相加的结果为5404319552844596乘以2 -54或5404319552844596/2 54

该数字5404319552844596/2 54

恰好是0.3000000000000000444089209850062616169452667236328125。
© www.soinside.com 2019 - 2024. All rights reserved.