为什么“np.inf // 2”导致 NaN 而不是无穷大?

Agu*_*guy 41 python floating-point numpy nan

我有点失望,np.inf // 2评估为np.nan而不是np.inf,就像正常除法的情况一样。

有什么原因让我想念为什么nan比 更好的选择inf

Tad*_*sen 33

我将成为只指出 C 级实现而不试图解释意图或理由的人:

*mod = fmod(vx, wx);
div = (vx - *mod) / wx;
Run Code Online (Sandbox Code Playgroud)

看起来为了计算divmod浮点数(当你只是做地板除法时被调用)它首先计算模数并且float('inf') %2只有有意义NaN,所以当它计算vx - mod它结束时NaN所以一切都传播 nan 其余的方式。

所以简而言之,由于楼层划分的实现在计算中使用了模数,即NaN,楼层划分的结果也以NaN

  • 是的,我认识到这一点,我非常希望看到更好的答案。然而,原因可能是“到目前为止还没有人真正考虑过它”,在这种情况下,恐怕这可能是唯一的答案。 (8认同)
  • 如果这确实是实现浮点数楼层划分的 C 代码,那么它可能是正确的,但非常不令人满意。你真的只是把罐子踢到路边。 (6认同)

Mis*_*agi 25

地板除法是相对于模定义的,两者都构成 divmod 运算的一部分。

二进制算术运算

楼层除法和模运算符通过以下身份连接:x == (x//y)*y + (x%y). Floor Division 和 modulo 也与内置函数 divmod(): 相连divmod(x, y) == (x//y, x%y)

这种等价不能成立x = inf——余数inf % y是未定义的——使inf // y模棱两可。这意味着nan结果至少与 一样好inf。为简单起见,CPython 实际上只实现了 divmod 并通过删除部分结果来派生 // 和 % —— 这意味着//继承nan自 divmod。