楼层除法 // vs int() 四舍五入
Floor division // vs int() rounded off
我是 Python 3.6.0 的新用户。我正在尝试除以产生大输出的 2 个数字。但是,使用
return ans1 // ans2
使用
时产生 55347740058143507128
return int(ans1 / ans2)
产生 55347740058143506432。
哪个更准确,为什么会这样?
从这个意义上讲,下限整数除法更准确。
这个结构的问题 int(ans1 / ans2)
,是结果暂时是一个浮点数(很明显,在将它转换为整数之前),引入舍入到最接近的浮点数(舍入的数量取决于数量级)。这甚至可以通过尝试通过一个浮点数往返该值来看出:
print(int(float(55347740058143507128)))
打印 55347740058143506432
。所以,因为普通的 /
会导致浮点数,这限制了它的准确性。
第一个更准确,因为它给出了精确的整数结果。
第二个将中间结果表示为浮点数。浮点数的分辨率有限 (53 bits of mantissa),而结果需要 66 位才能准确表示。这会导致准确性下降。
如果我们查看两个结果的十六进制表示:
>>> hex(55347740058143507128)
'0x3001aac56864d42b8L'
>>> hex(55347740058143506432)
'0x3001aac56864d4000L'
我们可以看到结果中不适合 53 位尾数的最低有效位全部设置为零。
一种直接查看舍入的方法,没有除法带来的任何复杂情况是:
>>> int(float(55347740058143507128))
55347740058143506432L
我是 Python 3.6.0 的新用户。我正在尝试除以产生大输出的 2 个数字。但是,使用
return ans1 // ans2
使用
时产生 55347740058143507128return int(ans1 / ans2)
产生 55347740058143506432。
哪个更准确,为什么会这样?
从这个意义上讲,下限整数除法更准确。
这个结构的问题 int(ans1 / ans2)
,是结果暂时是一个浮点数(很明显,在将它转换为整数之前),引入舍入到最接近的浮点数(舍入的数量取决于数量级)。这甚至可以通过尝试通过一个浮点数往返该值来看出:
print(int(float(55347740058143507128)))
打印 55347740058143506432
。所以,因为普通的 /
会导致浮点数,这限制了它的准确性。
第一个更准确,因为它给出了精确的整数结果。
第二个将中间结果表示为浮点数。浮点数的分辨率有限 (53 bits of mantissa),而结果需要 66 位才能准确表示。这会导致准确性下降。
如果我们查看两个结果的十六进制表示:
>>> hex(55347740058143507128)
'0x3001aac56864d42b8L'
>>> hex(55347740058143506432)
'0x3001aac56864d4000L'
我们可以看到结果中不适合 53 位尾数的最低有效位全部设置为零。
一种直接查看舍入的方法,没有除法带来的任何复杂情况是:
>>> int(float(55347740058143507128))
55347740058143506432L