質問

だから、問題を解決するためのPythonスクリプトをいくつか書くことで、物理の宿題を解決しようとすることにしました。私が直面している問題の1つは、重要な数字が常に適切に表示されるとは限らないことです。たとえば、これは有効数字を適切に処理します。

from decimal import Decimal
>>> Decimal('1.0') + Decimal('2.0')
Decimal("3.0")

しかし、これはそうではありません:

>>> Decimal('1.00') / Decimal('3.00')
Decimal("0.3333333333333333333333333333")

2つの質問:

  1. これは有効数字の予想された量ではないということですか、それとも有効数字の数学をブラッシュアップする必要がありますか?
  2. 手動で小数精度を設定せずにこれを行う方法はありますか?確かに、これを行うにはnumpyを使用できますが、好奇心から10進数モジュールでこれを行う方法があるかどうかを知りたいだけです。
役に立ちましたか?

解決

10進数の作業精度を2桁に変更することは、絶対に1つの操作のみを実行する場合を除き、 良いアイデアではありません。

重要度のレベルよりも高い精度で常に計算を実行し、最終結果のみを丸める必要があります。長い計算シーケンスを実行し、各ステップで有効桁数に丸めると、エラーが累積します。 decimalモジュールは、特定の操作が長いシーケンスの操作であるか、最終結果であるかを知らないため、必要以上に丸めるべきではないと想定します。理想的には無限の精度を使用しますが、高価すぎるため、Python開発者は28桁で解決しました。

最終結果に到達したら、おそらくクオンタイズが必要です:

>>> (Decimal('1.00') / Decimal('3.00')).quantize(Decimal("0.001"))
Decimal("0.333")

重要度を手動で追跡する必要があります。自動有意性追跡が必要な場合は、区間演算を使用する必要があります。 Pythonには、 pyinterval mpmath (任意の精度をサポート)。有向丸めをサポートしているため、10進数ライブラリで区間演算を実装するのも簡単です。

10進数演算FAQ:10進数演算‘有意性& #8217;算術演算?

他のヒント

小数部はそのような小数部を捨てません。精度を本当に2 d.p.に制限したい場合してみてください

decimal.getcontext().prec=2

編集:乗算または除算のたびにquantize()を呼び出すこともできます(加算と減算は2 dpsを保持します)。

好奇心から... decimalモジュールを使用する必要はありますか?数字を表示する準備ができているときに、数値の有効桁数を丸めた浮動小数点を使用しないのはなぜですか?または、計算の有効数字を追跡しようとしていますか(結果のエラー分析を行う必要がある場合、計算に含まれる不確実性の関数として計算されたエラーを計算する場合など)?数値を右ではなく左から丸める丸め関数が必要な場合は、次を試してください。

def lround(x,leadingDigits=0): 
    """Return x either as 'print' would show it (the default) 
    or rounded to the specified digit as counted from the leftmost 
    non-zero digit of the number, e.g. lround(0.00326,2) --> 0.0033
    """ 
    assert leadingDigits>=0 
    if leadingDigits==0: 
            return float(str(x)) #just give it back like 'print' would give it
    return float('%.*e' % (int(leadingDigits),x)) #give it back as rounded by the %e format  

数字を印刷または文字列に変換すると、数字は正しく見えますが、プロンプトで作業していて明示的に印刷しないと、少し奇妙に見える場合があります:

>>> lround(1./3.,2),str(lround(1./3.,2)),str(lround(1./3.,4))
(0.33000000000000002, '0.33', '0.3333')

10進数のデフォルトは28桁の精度です。
返される桁数を制限する唯一の方法は、精度を変更することです。

10進数を正しく理解すると、「精度」 10進表記の小数点以下の桁数です。

他の何か、つまり有効桁数が必要なようです。これは、科学表記法の小数点以下の桁数よりも1つ多くなります。

有効桁数を考慮した浮動小数点計算を行うPythonモジュールについて学ぶことに興味があります。

浮動小数点の何が問題になっていますか?

>>> "%8.2e"%  ( 1.0/3.0 )
'3.33e-01'

有効桁数が制限された科学スタイルの計算用に設計されました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top