Python 3.7 math.remainder和%(模运算符)之间的区别

vis*_*ell 5 python math cpython python-3.7

Python 3.7的新增功能中, 我们可以看到有新的math.remainder。它说

返回关于y的x的IEEE 754样式余数。对于有限x和有限非零y,这是差异x - n*y,其中n是最接近商的精确值的整数x / y。如果x / y恰好位于两个连续整数之间,则将最接近的偶数整数用于n。因此,其余部分r = remainder(x, y)始终令人满意abs(r) <= 0.5 * abs(y)

特殊情况遵循IEEE 754:尤其remainder(x, math.inf)是对于任何有限X X和remainder(x, 0)remainder(math.inf, x)提高ValueError任何非NaN的X。如果余数运算的结果为零,则该零将具有与x相同的符号。

在使用IEEE 754二进制浮点的平台上,此操作的结果始终可以精确表示:不引入舍入错误。

但我们也要记住,有一个%符号是

其余 x / y

我们还看到操作员需要注意:

不适用于复数。相反,abs()如果合适,使用转换为浮点数。

我甚至没有尝试过运行python 3.7。

但是我尝试过

Python 3.6.1 (v3.6.1:69c0db5050, Mar 21 2017, 01:21:04)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import math
>>> 100 % math.inf
100.0
>>> math.inf % 100
nan
>>> 100 % 0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
Run Code Online (Sandbox Code Playgroud)

所以,区别是,而不是nanZeroDivisionError我们会得到ValueError,因为它在文档中说。

所以问题是%和之间有什么区别math.remainder?请问math.remainder还用复数(工作%从它缺乏)?主要优势是什么?

这里是math.remainder官方CPython的GitHub库。

Maa*_*bré 5

返回 x 相对于 y 的 IEEE 754 样式余数。对于有限 x 和有限非零 y,这是差值x - n*y,其中 n 是最接近商的确切值的整数x / y。如果x / y正好位于两个连续整数的中间,则使用最近的偶数作为 n。因此余数r = remainder(x, y)总是满足abs(r) <= 0.5 * abs(y)

对于模数,这是m = x - n*y地方nfloor(x/y),如此0 <= m < y而不是abs(r) <= 0.5 * abs(y)对剩余部分。

所以

modulo(2.7, 1) = 0.7
remainder(2.7, 1) = -0.3
Run Code Online (Sandbox Code Playgroud)