次のコードのモジュロは何をしますか?
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
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
が好まれます。
3.14 % 6.28 = 3.14
のように、通常のモジュロ3.14%4 =3.14
と同じです3.14%2 = 1.14
(残り...)
通常のモジュロから期待されるものと同じもの.. 7 % 4 = 3
、7.3 % 4.0 = 3.3
浮動小数点の精度の問題に注意してください。
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
は整数モジュロに使用されます