下面这段代码中的模有什么作用?
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)
Return
fmod(x, y)
,由平台 C 库定义。请注意,Python 表达式x % y
可能不会返回相同的结果。C 标准的意图是对于某个整数 nfmod(x, y)
精确地(数学上;到无限精度)等于x - n*y
,使得结果具有与 相同的符号x
和幅度小于abs(y)
。Python 会x % y
返回带有符号的结果y
,并且对于浮点参数可能无法精确计算。例如fmod(-1e-100, 1e100)
is-1e-100
,但 Python 的-1e-100 % 1e100
is的结果1e100-1e-100
不能完全表示为浮点数,并且四舍五入到令人惊讶的1e100
。出于这个原因,fmod()
使用浮点数时通常首选函数,而 Python 的x % y
处理整数时是首选。
您对正常模数的期望相同..例如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
(余数...)
你应该使用 fmod(a,b)
While abs(x%y) < abs(y) is true
在数学上,因为floats
它在数值上可能不正确,因为roundoff
.
例如,假设 aPython float
是一个IEEE 754
双精度数的平台,为了与-1e-100 % 1e100
具有相同的符号1e100
,计算结果是-1e-100 + 1e100
,它在数值上完全等于1e100
。
数学模块中的函数fmod()
返回一个结果,其符号与第一个参数的符号匹配,因此-1e-100
在这种情况下返回。哪种方法更合适取决于应用程序。
where x = a%b
用于整数模