5

そこで、問題を解決するための 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 を使用してこれを行うことができると確信していますが、好奇心から decimal モジュールでこれを行う方法があるかどうかを知りたいだけです。
4

6 に答える 6

8

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

常に有意水準よりも高い精度で計算を実行し、最終結果のみを丸める必要があります。長い一連の計算を実行し、各ステップで有効桁数に丸めると、誤差が蓄積されます。decimal モジュールは、特定の操作が長いシーケンスの 1 つであるか、最終結果であるかを認識していないため、必要以上に丸めるべきではないと想定しています。無限の精度を使用するのが理想的ですが、それはコストがかかりすぎるため、Python 開発者は 28 桁に落ち着きました。

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

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

有意性を手動で追跡する必要があります。自動有意追跡が必要な場合は、区間演算を使用する必要があります。pyintervalmpmath (任意精度をサポート)など、Python で使用できるライブラリがいくつかあります。また、有向丸めをサポートしているため、decimal ライブラリを使用して区間演算を簡単に実装できます。

10 進数の算術 FAQも参照してください。

于 2008-09-27T22:00:35.570 に答える
3

小数はそのように小数点以下を捨てません。本当に精度を 2 dp に制限したい場合は、試してください

decimal.getcontext().prec=2

編集:代わりに、乗算または除算するたびに quantize() を呼び出すことができます (加算と減算は 2 dps を保持します)。

于 2008-09-27T18:58:37.927 に答える
1

好奇心から... 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')
于 2009-04-05T19:23:02.433 に答える
0

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

于 2008-09-27T18:53:49.730 に答える
0

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

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

これは、有効桁数が制限された科学的スタイルの計算用に設計されています。

于 2008-09-27T19:17:57.037 に答える
-1

Decimal を正しく理解していれば、「精度」は10 進数表記の小数点以下の桁数です。

あなたは何か他のものを望んでいるようです:有効桁数。これは、科学表記法の小数点以下の桁数より 1 多い数字です。

有効桁数を認識する浮動小数点計算を行う Python モジュールについて知りたいと思っています。

于 2008-09-27T19:11:46.817 に答える