我是 Python 3.6.0 的新用户。我正在尝试除以产生大输出的 2 个数字。但是,使用
return ans1 // ans2
使用时产生 55347740058143507128
return int(ans1 / ans2)
产生 55347740058143506432。
哪个更准确,为什么会这样?
我是 Python 3.6.0 的新用户。我正在尝试除以产生大输出的 2 个数字。但是,使用
return ans1 // ans2
使用时产生 55347740058143507128
return int(ans1 / ans2)
产生 55347740058143506432。
哪个更准确,为什么会这样?
第一个更准确,因为它给出了精确的整数结果。
第二个将中间结果表示为浮点数。浮点数的分辨率有限(尾数为 53 位),而结果需要 66 位才能准确表示。这会导致精度损失。
如果我们查看两个结果的十六进制表示:
>>> hex(55347740058143507128)
'0x3001aac56864d42b8L'
>>> hex(55347740058143506432)
'0x3001aac56864d4000L'
我们可以看到结果中不适合 53 位尾数的最低有效位都设置为零。
直接查看舍入的一种方法是:
>>> int(float(55347740058143507128))
55347740058143506432L
从这个意义上说,地板整数除法更准确。
这种构造的问题int(ans1 / ans2)
在于,结果暂时是一个浮点数(显然,在将其转换为整数之前),将舍入到最接近的浮点数(舍入量取决于数字的大小)。这甚至可以通过尝试通过浮点数往返该值来看到:
print(int(float(55347740058143507128)))
哪个打印55347740058143506432
。所以,因为 plain/
会导致浮点数,这限制了它的准确性。