我对np.inf // 2
的求值为np.nan
而不是np.inf
感到失望,这与常规除法一样。
我为什么错过了nan
比inf
更好的选择的原因?
答案 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())