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)

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 % 1e100isの結果は1e100-1e-100float として正確に表すことができず、驚くべき に丸められ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

通常の modulo と同じ 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 floatIEEE 754倍精度数であるプラットフォームを想定すると-1e-100 % 1e100、 と同じ符号を持つため1e100に、計算結果は-1e-100 + 1e100になり、数値的には と正確に等しくなり1e100ます。

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

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

于 2013-05-15T14:26:32.083 に答える