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

时间:2020-08-11 17:06:25

标签: python numpy floating-point nan

我对np.inf // 2的求值为np.nan而不是np.inf感到失望,这与常规除法一样。

我为什么错过了naninf更好的选择的原因?

3 个答案:

答案 0 :(得分:34)

我将成为just points at the C level实现者​​,而不会试图解释其意图或理由:

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

看起来要计算浮点数的divmod(刚好在do floor division时会被调用),它首先计算模数,而float('inf') %2才是{{1} },因此当它计算NaN时会以vx - mod结尾,因此一切都会以其他方式传播。

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

答案 1 :(得分:26)

底除法是相对于模定义的,两者均构成divmod操作的一部分。

Binary arithmetic operations

楼层划分和模运算符通过以下方式连接 身份:x == (x//y)*y + (x%y)。地板除法和模也 与内置函数divmod()连接:divmod(x, y) == (x//y, x%y)

此等价不适用于x = inf —其余inf % y未定义—使inf // y模棱两可。这意味着nan的结果至少与inf一样好。为简单起见,CPython actually only implements divmod and derives both // and % by dropping a part of the result —这意味着//从divmod继承了nan

答案 2 :(得分:0)

无穷大不是数字。例如,您can't even say无限-无限为零。因此,您将遇到这样的限制,因为NumPy是一个数值数学包。我建议使用像SymPy这样的符号数学包,它可以使用无穷大来处理许多不同的表达式:

serverRequest.bodyToMono(String.class)
  .doOnNext(validator::validateRequestString)
  .bodyToMono(MyRequestBody.class)
  .map(request -> proceed())
相关问题