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
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。