预测输入浮点数的Python 3.6的`math.floor`输出

时间:2018-08-29 21:57:12

标签: python-3.x floor

在Python3(我使用的是3.6)中,它们decided to start outputting Integral values

那给我带来了以下问题。假设我们输入了一个大的浮点数

math.floor(4.444444444444445e+85)

在这种情况下的输出是

44444444444444447395279681404626730521364975775215375673863470153230912354225773084672

在Python2.7中,输出曾经是4.444444444444445e+85

问题1: 3.6的输出是否可重现?换句话说,这是什么?在不同的计算机上多次计算得出的结果相同。我想那是一个仅取决于输入4.444444444444445e+85的值。我的猜测是它是该浮点数的二进制表示形式的下限。输出的因式分解为

2^232 × 3 × 17 × 31 × 131 × 1217 × 1933 × 13217

该因子2 ^ 232接近科学计数法的10 ^ 70,但我不确定。

问题2:我想我知道如何进行浮点运算4.444444444444445e+85,提取其有效位数和指数,然后得出自己的实际整数值为4444444444444445 * 10 ** 70或浮点数4.444444444444445e + 85,我认为float(4.444444444444445e+85)底限的值更诚实。是否有一种整洁的方法来恢复这种诚实的地板(我可以这样称呼)?

好吧,我收回关于在小数表示形式的底端调用“诚实”的内容。由于计算机以二进制形式存储数字,因此可以公平地称呼为二进制表示形式计算的输出。如果我对问题1的猜测是正确的,那么这是正确的。

1 个答案:

答案 0 :(得分:1)

以十六进制显示输出应该会有所帮助:

>>> import math
>>> math.floor(4.444444444444445e+85)
44444444444444447395279681404626730521364975775215375673863470153230912354225773084672
>>> hex(_)
'0x16e0c6d18f4bfb0000000000000000000000000000000000000000000000000000000000'

注意所有尾随零!在几乎所有平台上,Python浮点数都是由硬件表示的,其有效位数包含53位,并具有2的幂。而且,的确,

>>> (0x16e0c6d18f4bfb).bit_length() # the non-zero part does have 53 bits
53
>>> 0x16e0c6d18f4bfb * 2**232  # and 232 zero bits follow it
44444444444444447395279681404626730521364975775215375673863470153230912354225773084672

因此,从数学上讲,您获得的整数与您开始使用的浮点数完全相等。另一种查看方式:

>>> (4.444444444444445e85).hex()
'0x1.6e0c6d18f4bfbp+284'

如果您想使用十进制表示形式,请参阅decimal模块的文档。

编辑:正如评论中所讨论的,也许您在这里真正想要的只是

float(math.floor(x))

这将再现与Python 2相同的结果

math.floor(x)