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 % 1e100
是1e100-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 float
是IEEE 754
双精度数的平台,为了-1e-100 % 1e100
与1e100
具有相同的符号,计算结果为-1e-100 + 1e100
,即在数值上完全等于1e100
。
数学模块中的函数fmod()
返回一个结果,其符号与第一个参数的符号匹配,因此在这种情况下返回-1e-100
。哪种方法更合适取决于应用程序。
where x = a%b
用于整数模
【讨论】:
以上是关于Python中的模运算符的主要内容,如果未能解决你的问题,请参考以下文章