下面这段代码中的模运算符是什么意思?
from math import *
3.14 % 2 * pi
如何对浮点数进行取模运算?
当你有这个表达式:
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)
(在任何一种情况下,算法是相同的。只需不断减少/增加,直到数字尽可能小)。
fmod
文档对此问题有些有趣的解释:
math.fmod(x, y)
返回由平台C库定义的
fmod(x, y)
。注意,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
。谢谢! - Blender同普通的取模一样,您可以期望得到相同的结果。例如:7 % 4 = 3
,7.3 % 4.0 = 3.3
但要注意浮点数精度问题。
与普通取模运算相同,3.14 % 6.28 = 3.14
,就像3.14%4 =3.14
和3.14%2 = 1.14
一样(余数...)
3.14 % 2 * pi
等同于 (3.14 % 2) * pi == 1.14 * pi
而不是 3.14 % (2 * pi)
。 - Mad Physicist3.14 % (2*pi)
仍然是 3.14
,这正是我所举的一个小于3.14的数来说明的例子... 据我所知,这个问题并不是关于运算顺序的,但无所谓了。 - Joran Beasley你应该使用fmod(a,b)
虽然在数学上 abs(x%y) < abs(y) 是正确的,但是对于
floats
来说,由于 roundoff
的原因,它可能在数值上不正确。
例如,假设一个平台上的 Python float
是一个 IEEE 754
双精度数字,在计算 -1e-100 % 1e100
使其与 1e100
具有相同的符号,结果为 -1e-100 + 1e100
,这在数值上完全等于 1e100
。
函数 fmod()
在 math 模块中返回一个结果,其符号与第一个参数的符号匹配,因此在这种情况下返回 -1e-100
。哪种方法更合适取决于应用程序。
当 x = a%b 用于整数模数时
(-123) % 10 == 7
,而在其他编程语言如C++中,结果是-3的原因。因为(-123) - (math.floor(-123/10)*10) == 7
- very hit