多头的奇怪 Python 3 mod 行为
Strange Python 3 mod behavior for longs
考虑这个代码片段。
>>> n, m = 10011617, 100000000000006340
>>> s = lambda n: n * (n + 1) / 2
>>> s(n)
50116242483153.0
>>> s(n) == int(s(n))
True
>>> m % s(n)
18096246116101.0
>>> m % int(s(n))
18096246116105
如您所见,s(n)
是一个整数(数学上),但 m % s(n) != m % int(s(n))
.
这可能与 s(n)
或 m
长期存在有关吗?即使是这样,为什么 s(n) == int(s(n))
但是当我取模时结果不相等?
P.S。我运行这个在repl.it
在这种特殊情况下,问题更多是由于 m
而不是 s(n)
。在计算 m % s(n)
时,由于 s(n)
是一个浮点数,所以 m
被强制转换为一个浮点数。但是 -- float(m)
失去了精度。最清楚的方法是
m == 100000000000006340
但是
int(float(m)) == 100000000000006336
注意100000000000006336 % 50116242483153 == 18096246116101
,表示神秘值的来源
考虑这个代码片段。
>>> n, m = 10011617, 100000000000006340
>>> s = lambda n: n * (n + 1) / 2
>>> s(n)
50116242483153.0
>>> s(n) == int(s(n))
True
>>> m % s(n)
18096246116101.0
>>> m % int(s(n))
18096246116105
如您所见,s(n)
是一个整数(数学上),但 m % s(n) != m % int(s(n))
.
这可能与 s(n)
或 m
长期存在有关吗?即使是这样,为什么 s(n) == int(s(n))
但是当我取模时结果不相等?
P.S。我运行这个在repl.it
在这种特殊情况下,问题更多是由于 m
而不是 s(n)
。在计算 m % s(n)
时,由于 s(n)
是一个浮点数,所以 m
被强制转换为一个浮点数。但是 -- float(m)
失去了精度。最清楚的方法是
m == 100000000000006340
但是
int(float(m)) == 100000000000006336
注意100000000000006336 % 50116242483153 == 18096246116101
,表示神秘值的来源