1

誰かが大きな除数でのこの奇妙な結果の説明を手伝ってくれることを願っています.

>>> m = 1e9+9
>>> n = 1000000009
>>> m == n
True
>>> 2549015908609065 % m
885667930.0
>>> 2549015908609065 % n
885667930
>>> 2549015908609065L % n
885667930L
>>> 2549015908609065L % m
885667930.0

>>> 254901590860906524041412370460835L % m
98506080.0
>>> 254901590860906524041412370460835L % n
327998297L

>>> 254901590860906524041412370460835L % int(m)
327998297L
4

2 に答える 2

2

奇妙な結果が表示される理由は、不正確な表現を持つ浮動小数点数でモジュロを実行しているためです。decimalモジュールのドキュメントは、これを非常によく強調しています。

非常に大きな数に対して正確な演算を実行するには、次のように decimal クラスを使用できます。

from decimal import *
print Decimal(2549015908609065) % Decimal(1e9) # Gives the answer you expect
于 2013-09-10T19:03:43.373 に答える
1

m = 1e9+9数値を float として格納します。ただしn = 1000000009、数値は整数として格納されます。

整数を float で除算すると、python は結果として暗黙的に float を出力します。ただし、整数を別の整数で割ると、整数の商が得られます。より大きな数値に対する Float の精度は低下します。

気がつけば、

>>> 254901590860906524041412370460835L % m
98506080.0
#outputted a float with different precision

>>> 254901590860906524041412370460835L % n
327998297L
#outputted a long int

http://www.tutorialspoint.com/python/python_numbers.htmで Python の数値に関する基本的なチュートリアルを確認してください。

于 2013-09-10T19:06:43.903 に答える