繁体   English   中英

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

[英]Why does “np.inf // 2” result in NaN and not infinity?

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

我是否有理由错过为什么nan是比inf更好的选择?

我将成为仅指出 C 级别实施的人,而没有任何试图解释意图或理由的人:

*mod = fmod(vx, wx);
div = (vx - *mod) / wx;

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

所以简而言之,由于地板除法的实现在计算中使用模数,即NaN ,地板除法的结果也以NaN结尾

楼层划分是根据模数定义的,两者都构成了 divmod 操作的一部分。

二进制算术运算

底除法和取模运算符通过以下恒等式连接: x == (x//y)*y + (x%y) 楼层除法和取模也与内置的 function divmod(): divmod(x, y) == (x//y, x%y)连接。

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

无穷大不是一个数字。 例如,你甚至不能说无穷大——无穷大是零。 所以你会遇到这样的限制,因为 NumPy 是一个数值数学 package。 我建议使用符号数学 package 之类的SymPy ,它可以使用无穷大处理许多不同的表达式:

import sympy as sp

sp.floor(sp.oo/2)
sp.oo - 1
sp.oo + sp.oo

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM