私は数学プログラムに取り組んでいますが、ラウンドにはかなり大きな問題があります。したがって、私のプログラムはいくつかの計算を行った後、結果を丸めます。
すべて正常に動作しますがresult == 2.49999999999999992
、ラウンド関数が3.0
ではなく を返す場合2.0
。
どうすれば修正できますか?
ありがとう。
私は数学プログラムに取り組んでいますが、ラウンドにはかなり大きな問題があります。したがって、私のプログラムはいくつかの計算を行った後、結果を丸めます。
すべて正常に動作しますがresult == 2.49999999999999992
、ラウンド関数が3.0
ではなく を返す場合2.0
。
どうすれば修正できますか?
ありがとう。
@Pavel Anossovがコメントで述べているようにthere's no such thing as 2.49999999999999992 in IEEE 754, 2.49999999999999992 == 2.5.
。いずれにせよ (32/64/128 ビットの浮動小数点数)、精度の制限があるため、浮動小数点数は計算にとって常に重要になる可能性があります。これは明らかに Python float にも制限されています。
これに対処するためのさまざまなオプションがあります。たとえば、decimalライブラリを使用できます。
>>> from decimal import *
>>> getcontext().prec = 6
>>> Decimal(1) / Decimal(7)
Decimal('0.142857')
>>> getcontext().prec = 28
>>> Decimal(1) / Decimal(7)
Decimal('0.1428571428571428571428571429')
その場合、精度を自分で設定することができます。decimalは標準ライブラリにあります。
使用できるbigfloatのようなサードパーティのライブラリもあります (私は経験がありません)。
>>> from bigfloat import *
>>> sqrt(2, precision(100)) # compute sqrt(2) with 100 bits of precision
しかし、ご覧のとおり、常に精度を選択する必要があります。本当にどんな種類の精度も失いたくない場合は、分数を使用してください (これも標準ライブラリにあります)。
>>> from fractions import Fraction
>>> a = Fraction(16, -10)
>>> a
Fraction(-8, 5)
>>> a / 23
Fraction(-8, 115)
>>> float(a/23)
-0.06956521739130435