Python中的模运算符

Posted

技术标签:

【中文标题】Python中的模运算符【英文标题】:Modulo operator in Python 【发布时间】:2012-09-27 02:34:36 【问题描述】:

下面这段代码中的模有什么作用?

from math import *
3.14 % 2 * pi

我们如何计算浮点数的模数?

【问题讨论】:

【参考方案1】:

当你有表达式时:

a % b = c

这确实意味着存在一个整数 n,它使 c 尽可能小,但非负数。

a - n*b = c

您可以手动减去2(如果您的数字是负数,则添加2),直到最终结果是可能的最小正数:

  3.14 % 2
= 3.14 - 1 * 2
= 1.14

另外,3.14 % 2 * pi 被解释为(3.14 % 2) * pi。我不确定您是否打算写3.14 % (2 * pi)(在任何一种情况下,算法都是相同的。只需减/加,直到数字尽可能小)。

【讨论】:

我更喜欢 x%y 是 x - (math.floor(x/y)*y) 的解释,这和你说的一样,但对我来说更容易理解 @sabbahillel 这就是为什么在 python3 中(-123) % 10 == 7,而在 C++ 等其他语言中结果是 -3。因为(-123) - (math.floor(-123/10)*10) == 7 @veryhit 你知道对 Python 源代码的任何引用,其中 % 定义为 x - (math.floor(x/y)*y) 吗? % 在 cPython 中的定义是否不同?我知道 math.fmod 方法的文档,但我想知道原生 % 运算符是如何定义的。 @MNCODE:这是它在 CPython 中的定义方式:github.com/python/cpython/blob/…【参考方案2】:

与普通的模 3.14 % 6.28 = 3.14 相同,就像 3.14%4 =3.14 3.14%2 = 1.14(余数...)

【讨论】:

@MadPhysicist 什么? modulo 的运算顺序与 pow 相同...肯定小于等于...所以有什么问题? %/ 具有相同的优先级,这绝对低于 pow(尽管与 times 相同)。 3.14 % 2 * pi(3.14 % 2) * pi == 1.14 * pi 相同,而不是 3.14 % (2 * pi) 我的回答中没有任何时间或分歧......如果我这样做了,我可能会用括号将事情分组......我不完全确定你在说什么哦我现在......在最初的问题不太清楚 OP 希望在哪里使用括号 3.14 % ( 2*pi) 但是仍然是 3.14 我的示例试图用小于 3.14 的数字来证明... afaik 问题不是关于操作的顺序,而是嗯 很公平。我现在无法删除反对票,尽管现在您已经解释了答案是有道理的。【参考方案3】:

除了其他答案之外,fmod documentation 关于这个主题还有一些有趣的事情要说:

math.fmod(x, y)

返回fmod(x, y),由平台C定义 图书馆。请注意,Python 表达式 x % y 可能不会返回相同的值 结果。 C 标准的意图是 fmod(x, y) 是 (数学上;精确到无限)对于某些人来说等于x - n*y 整数 n 使得结果具有与x 相同的符号和幅度 小于abs(y)。 Python 的x % y 返回带有y 符号的结果 相反,对于浮点参数可能无法完全计算。为了 例如,fmod(-1e-100, 1e100)-1e-100,但是 Python 的结果 -1e-100 % 1e1001e100-1e-100,不能完全表示为浮点数,四舍五入到令人惊讶的 1e100。为此原因, 函数fmod() 在使用浮点数时通常是首选,而 处理整数时首选 Python 的 x % y

【讨论】:

我从来不知道fmod。谢谢!【参考方案4】:

你对普通模数的期望是一样的。 7 % 4 = 3, 7.3 % 4.0 = 3.3

注意浮点精度问题。

【讨论】:

【参考方案5】:

你应该使用 fmod(a,b)

While abs(x%y) < abs(y) is true 在数学上,对于floats,由于roundoff,它在数字上可能不正确。

例如,假设Python floatIEEE 754双精度数的平台,为了-1e-100 % 1e1001e100具有相同的符号,计算结果为-1e-100 + 1e100,即在数值上完全等于1e100

数学模块中的函数fmod() 返回一个结果,其符号与第一个参数的符号匹配,因此在这种情况下返回-1e-100。哪种方法更合适取决于应用程序。

where x = a%b 用于整数模

【讨论】:

以上是关于Python中的模运算符的主要内容,如果未能解决你的问题,请参考以下文章

Python中负数的模运算

使用带浮点数的模运算符

C中按位运算的模运算

高效的模 3 运算? [复制]

C++ 中高数的模幂运算

C++ 中高数的模幂运算