【问题标题】:Strange Python 3 mod behavior for longs长的奇怪的 Python 3 mod 行为
【发布时间】:2021-04-29 18:55:02
【问题描述】:

考虑一下这段代码 sn-p。

>>> 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)) 却在我取模时结果不相等?

附注我在 repl.it 中运行了这个

【问题讨论】:

  • 使用整数除法n * (n + 1) / /2 而不是n * (n + 1) / 2。浮点数的精度有限。
  • 其实——不一样。对于较大的n(n+1)//2 可能与int((n+1)/2) 不同。
  • @JohnColeman 我明白了。那么为什么 python 为 s(n) == int(s(n)) 返回 True 但在我取模时返回不同的结果?
  • 因为== 在浮点数和整数之间应用时的实现方式。
  • 不是完全重复,但请参阅:Python modulo on floats,因为这是您在 %s(n) 中使用的运算符

标签: python-3.x math integer long-integer


【解决方案1】:

在这种特殊情况下,问题更多是由于m 而不是s(n)。在计算m % s(n) 时,由于s(n) 是一个浮点数,所以m 被强制为一个浮点数。但是——float(m) 失去了精度。看到这一点的最清楚的方法是

m == 100000000000006340

但是

int(float(m)) == 100000000000006336

注意100000000000006336 % 50116242483153 == 18096246116101,它显示了神秘值的来源。

【讨论】:

    猜你喜欢
    • 2020-08-27
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    • 2022-08-23
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 2020-10-22
    相关资源
    最近更新 更多