次のコードのモジュロは何をしますか?
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の符号を持つ結果を返し、yfloat 引数に対して正確に計算できない場合があります。たとえば、fmod(-1e-100, 1e100)is です-1e-100が、Python の-1e-100 % 1e100isの結果は1e100-1e-100float として正確に表すことができず、驚くべき に丸められ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整数モジュロに使用されます