次のコードのモジュロは何をしますか?
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)
fmod(x, y)
プラットフォーム C ライブラリで定義されているように、 を返します。Python 式x % y
は同じ結果を返さない場合があることに注意してください。C 標準の意図は、ある整数 n に対してfmod(x, y)
正確に (数学的に; 無限の精度で) 等しくx - n*y
、結果が と同じ符号x
で大きさが より小さいことですabs(y)
。Python のは代わりにx % y
の符号を持つ結果を返し、y
float 引数に対して正確に計算できない場合があります。たとえば、fmod(-1e-100, 1e100)
is です-1e-100
が、Python の-1e-100 % 1e100
isの結果は1e100-1e-100
float として正確に表すことができず、驚くべき に丸められ1e100
ます。このため、fmod()
Python のx % y
整数を操作する場合に推奨されます。
通常のモジュロから期待されるのと同じこと..例えば7 % 4 = 3
、7.3 % 4.0 = 3.3
浮動小数点の精度の問題に注意してください。
通常の modulo と同じ 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
ます。
math モジュールの関数fmod()
は、符号が最初の引数の符号と一致する結果を返すため-1e-100
、この場合は戻ります。どちらのアプローチがより適切かは、アプリケーションによって異なります。
where x = a%b
整数モジュロに使用されます