3

私は数学プログラムに取り組んでいますが、ラウンドにはかなり大きな問題があります。したがって、私のプログラムはいくつかの計算を行った後、結果を丸めます。

すべて正常に動作しますがresult == 2.49999999999999992 、ラウンド関数が3.0ではなく を返す場合2.0

どうすれば修正できますか?

ありがとう。

4

2 に答える 2

5

@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
于 2013-08-11T17:13:49.447 に答える