在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的猜测是正确的,那么这是正确的。
答案 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)