以下代码中的模数是什么?
from math import *
3.14 % 2 * pi
我们如何计算浮点数的模数?
答案 0 :(得分:62)
当你有表达式时:
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)
(在任何一种情况下,算法都是相同的。只需减去/添加,直到数字尽可能小)。
答案 1 :(得分:24)
除了其他答案之外,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()
通常在使用浮点数时是首选,而 使用整数时,首选Pythonx % y
。
答案 2 :(得分:2)
与普通模3.14 % 6.28 = 3.14
相同,就像3.14%4 =3.14
3.14%2 = 1.14
(其余的......)
答案 3 :(得分:2)
你期望从正常的模数中得到同样的东西......例如7 % 4 = 3
,7.3 % 4.0 = 3.3
注意浮点精度问题。
答案 4 :(得分:1)
你应该使用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
。
math模块中的函数fmod()
返回一个符号与第一个参数的符号匹配的结果,因此在这种情况下返回-1e-100
。哪种方法更合适取决于应用程序。
where x = a%b
用于整数模