2017-07-19 21 views
1

Decimalを使用して私のプログラムで精度の問題が発生しました。精度が1の累乗に引き上げられたときの精度が失われる

シンプルREPRO:

from decimal import Decimal 

print Decimal(1910944005427272400562113336049664) 
print Decimal(1910944005427272400562113336049664)**1 
print int(Decimal(1910944005427272400562113336049664)**1) 

は与える:

1910944005427272400562113336049664 
1.910944005427272400562113336E+33 
1910944005427272400562113336000000 

あなたが見ることができるように、元の値が(正確にはマイナス49664)わずかに小さくなっています。

私の実際のコードは、1の累乗で数値を上げる以外にも、正確さが低下します。

私が利用できる「良いDecimal」はありますか?

私の入力と出力は、0以上2^256以下です。

+1

整数演算のみを使用していますか? – Phylogenesis

+0

@Phylogenesis:いいえ、それはタグに記載されていますが、質問自体の中でおそらく強調しておきたいはずです。ところで、もし私が整数算術だけを使っていたのであれば、Pythonは256ビットの整数算術をサポートしているので、まずは「Decimal」は必要ありません。 – goodvibration

答えて

3

the documentationに記載されているように、「小数点モジュールはユーザーが変更できる精度(デフォルトは28個)です」。精度を高く設定して正確な結果を得ることができます。

>>> decimal.getcontext().prec = 100 
>>> print(int(Decimal(1910944005427272400562113336049664)**Decimal(1))) 
1910944005427272400562113336049664 
+0

これは「グローバル」設定ですか、** ** Decimalインスタンスごとに行う必要がありますか? – goodvibration

+0

ああ、グローバル(あなたのコードから明らかです)。 – goodvibration

+0

'prec 'の最大値は何ですか? – goodvibration

関連する問題