54

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

from math import *
3.14 % 2 * pi

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

4

5 回答 5

66

当你有表达式时:

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)(在任何一种情况下,算法都是相同的。只需减/加,直到数字尽可能小)。

于 2012-10-05T22:11:46.227 回答
25

除了其他答案之外,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 % 1e100is的结果1e100-1e-100不能完全表示为浮点数,并且四舍五入到令人惊讶的1e100。出于这个原因,fmod()使用浮点数时通常首选函数,而 Python 的x % y处理整数时是首选。

于 2012-10-05T22:14:01.657 回答
3

您对正常模数的期望相同..例如7 % 4 = 37.3 % 4.0 = 3.3

当心浮点精度问题。

于 2012-10-05T22:14:23.710 回答
2

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

于 2012-10-05T22:12:23.347 回答
1

你应该使用 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用于整数模

于 2013-05-15T14:26:32.083 回答