2016-04-11 24 views
0

私はPythonで浮動小数点数を減算しようとしています。私はa-bを印刷しようとすると、私はしました は、それが実際の値1460356156114541.06861877に値1460356156114541.000000反して結果だ、Pythonの浮動小数点減算

a = 1460356156116843.000000, b = 2301.93138123

値。

浮動小数点演算を行う際のPythonの制限は何ですか?私はこの減算の実際の結果を得ることができる任意の方法は、Pythonにありますか?

+2

pythonが整数減算を行っているか、結果を整数に解析しているようです。値の割り当て方法と結果の計算方法を正確に表示できますか?関連するコードブロックをコピーして貼り付けてください。 – FallenAngel

+1

も参照http://sopython.com/canon/87/why-is-this-particular-floating-point-math-operation-not-giving-the-correct-answ/ – tripleee

+1

浮動小数点数は基本的に有効数字を表します、あなたは多数の小さな違いを追跡することはできません。あなたの 'a 'は16桁の長さなので、分数差を表すために残っている「部屋」はありません。関係する数字に比べて非常に小さい差異を把握する必要がある点で、どのような状況になっていますか? – BrenBarn

答えて

3

Pythonには、他のすべての言語と同じ浮動小数点演算の制限があります。

from decimal import Decimal 

a = Decimal('1460356156116843.000000') 
b = Decimal('2301.93138123') 

print a - b # 1460356156114541.06861877 
1

PythonはそのフロートのためIEEE 754 doublesを使用しています:あなたは、正確な結果を得るためにDecimalを使用することができます。ですから、15人の重要な数字の後に何かをSFのように扱うべきです。それは新しく初期設定された番号のためだけです。浮動小数点数を使用して演算を開始すると、精度が大幅に低下する可能性があります。特に、絶対値が大幅に異なる数値間の加算または減算を行う必要があります。

OTOHの場合、大きさが互いに非常に近い数の間で減算を行うと、catastrophic cancellationになる可能性があります。

これらの問題の影響を軽減するには、を実行してください。には、浮動小数点演算がどのように動作し、正常に動作するかをよく理解する必要があります。

また、PythonのDecimalモジュールなど、より高い精度を提供するライブラリで作業することもできます。致命的な取り消しや重要性を失うその他の問題を避けるためには注意が必要ですが、少なくとも重要な数字があります。

Decimalモジュールは基本的な算術演算を提供するだけです。三角関数や指数関数などの高度な数学関数が必要な場合は、優れたサードパーティの任意精度数学モジュールmpmathをご覧ください。それは複素数を処理し、方程式を解くことができ、いくつかの微積分演算を提供することができます。

0

小数点を使用すると便利です。しかし、重要な数字を保持することの重要性を実証するために、この例を挙げておきます。

import sys 
print(sys.maxsize) 
9223372036854775807 # for 64 bit machine, the max integer number. But it can grow as needed. 

したがって、上記の場合は2つのステップで計算できます。

1460356156116842 - 2301 = 1460356156114541 # all integer digits preserved 
1 - .93138123 = 0.06861877 # all significant float digits preserved. 

したがって、答えは2つを追加することです。しかし、そうすると、すべての浮動小数点数が失われます。 64ビットはすべての数字を保持するのに十分な大きさではありません。