web-dev-qa-db-ja.com

Pythonのモジュロ演算子

次のコードのモジュロは何をしますか?

from math import *
3.14 % 2 * pi

浮動小数点数のモジュロを計算するにはどうすればよいですか?

49
KodeWarrior

式がある場合:

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)を書くつもりだったかどうかわかりません(どちらの場合もアルゴリズムは同じです。数値ができる限り小さくなるまで減算/加算してください)。

62
Blender

他の回答に加えて、 fmod documentation には、この件に関して興味深い興味深いことがあります:

math.fmod(x, y)

プラットフォームCライブラリで定義されているfmod(x, y)を返します。 Python式x % yは同じ結果を返さない場合があることに注意してください。 C標準の意図は、結果がxと同じ符号を持ち、大きさがfmod(x, y)未満になるように、abs(y)が整数nに対してx - n*yと正確に(数学的に、無限精度に)等しくなるようにすることです。 Pythonのx % yは、代わりにyの符号を持つ結果を返します。浮動小数点引数については正確に計算できない場合があります。たとえば、fmod(-1e-100, 1e100)-1e-100ですが、Pythonの-1e-100 % 1e100の結果は1e100-1e-100であり、フロートとして正確に表すことはできず、驚くべき1e100に丸められます。このため、フロートを使用する場合は関数fmod()が一般的に好まれ、整数を使用する場合はPythonのx % yが好まれます。

24
Thomas

3.14 % 6.28 = 3.14のように、通常のモジュロ3.14%4 =3.14と同じです3.14%2 = 1.14(残り...)

2
Joran Beasley

通常のモジュロから期待されるものと同じもの.. 7 % 4 = 37.3 % 4.0 = 3.3

浮動小数点の精度の問題に注意してください。

2
Xorlev

fmod(a、b)を使用する必要があります

While abs(x%y) < abs(y) is true数学的には、floatsの場合、roundoffのために数値的に真ではない場合があります。

たとえば、Python floatIEEE 754倍精度数であるプラットフォームを想定すると、-1e-100 % 1e1001e100と同じ符号を持つため、計算結果は-1e-100 + 1e100になり、これは数値的に1e100と等しくなります。

Mathモジュールの関数fmod()は、その符号が最初の引数の符号と一致する結果を代わりに返すため、この場合は-1e-100を返します。どのアプローチがより適切かは、アプリケーションによって異なります。

where x = a%bは整数モジュロに使用されます

1
praveen kansara