Python学習:decimal---10進定点と浮動小数点演算


decimalモジュールは、高速で正確に丸められた10進数浮動小数点演算をサポートします.モジュール設計は3つの概念を中心としている:10進数、算術コンテキスト、信号.
  • 十進数は可変ではありません.シンボル、係数数字、指数があります.重要性を維持するために、係数数はゼロに続くことを遮断しません.10進数には、Infinity、-Infinity、NaNなどの特殊な値も含まれます.この規格では、-0と+0も区別されています.
  • 算術のコンテキストは、精度、丸めルール、指数制限、操作結果を示すフラグ、およびシンボルが異常とみなされるかどうかを決定するトラップイネーブラを指定する環境である.丸めオプションには、ROUND_が含まれます.CEILING 、 ROUND_DOWN 、 ROUND_FLOOR 、 ROUND_HALF_DOWN, ROUND_HALF_EVEN 、 ROUND_HALF_UP 、 ROUND_UPおよびROUND_05UP.
  • 信号は、計算中に発生する異常条件群である.アプリケーションの必要に応じて、信号は無視されたり、情報と見なされたり、異常と見なされたりする可能性があります.十進法モジュールの信号は、Clamped、InvalidOperation、DivisionByZero、Inexact、Rounded、Subnormal、Overflow、UnderflowおよびFloatOperationである.
  • 各信号には、1つのフラグと1つのトラップイニシエータがある.信号に遭遇した場合、フラグは1に設定され、トラップイネーブラが1に設定されている場合、例外が発生します.フラグは粘性であるため、計算を監視する前にリセットする必要があります.

  • クイックスタートチュートリアル
    通常、小数点以下の値を使用するのは、インポートモジュールです.現在のコンテキストを表示するには、getcontext()を使用します.必要に応じて、精度、丸め、または有効化されたトラップの新しい値を設定します.
    >>> from decimal import *
    >>> getcontext()
    Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
            capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
            InvalidOperation])
    
    >>> getcontext().prec = 7       # Set a new precision
    

    10進数インスタンスは、整数、文字列、浮動小数点数、またはメタグループから構築できます.整数または浮動小数点構造から整数または浮動小数点値の正確な変換が実行されます.10進数には、NaNが「非数値」、正と負のInfinity、および-0を表す特殊な値が含まれます.
    >>> getcontext().prec = 28
    >>> Decimal(10)
    Decimal('10')
    >>> Decimal('3.14')
    Decimal('3.14')
    >>> Decimal(3.14)
    Decimal('3.140000000000000124344978758017532527446746826171875')
    >>> Decimal((0, (3, 1, 4), -2))
    Decimal('3.14')
    >>> Decimal(str(2.0 ** 0.5))
    Decimal('1.4142135623730951')
    >>> Decimal(2) ** Decimal('0.5')
    Decimal('1.414213562373095048801688724')
    >>> Decimal('NaN')
    Decimal('NaN')
    >>> Decimal('-Infinity')
    Decimal('-Infinity')
    

    新しいDecimalの重要性は、入力したビット数のみで決まります.コンテキスト精度と丸めは、算術演算中にのみ機能します.
    >>> getcontext().prec = 6
    >>> Decimal('3.0')
    Decimal('3.0')
    >>> Decimal('3.1415926535')
    Decimal('3.1415926535')
    >>> Decimal('3.1415926535') + Decimal('2.7182818285')
    Decimal('5.85987')
    >>> getcontext().rounding = ROUND_UP
    >>> Decimal('3.1415926535') + Decimal('2.7182818285')
    Decimal('5.85988')
    

    Decimalはいくつかの数学関数を使用することもできます
    >>> getcontext().prec = 28
    >>> Decimal(2).sqrt()
    Decimal('1.414213562373095048801688724')
    >>> Decimal(1).exp()
    Decimal('2.718281828459045235360287471')
    >>> Decimal('10').ln()
    Decimal('2.302585092994045684017991455')
    >>> Decimal('10').log10()
    Decimal('1')
    

    有効数字の設定方法
    from decimal import *
    getcontext().prec = 6
    Decimal(1)/Decimal(7)
    #    Decimal('0.142857'),      
    

    quantize()メソッド
    quantize()メソッドは、数値を固定指数に四捨五入します.このメソッドは、結果を一定の場所に丸めた通貨アプリケーションに役立ちます.
    bb=decimal.Decimal('7.325').quantize(decimal.Decimal('.01'), decimal.ROUND_UP)
    print(bb)
    b=decimal.Decimal('7.325').quantize(decimal.Decimal('.01'), decimal.ROUND_DOWN)
    print(b)
    
      :
    7.33
    7.32
    

    Rounding modes
  • decimal.ROUND_CEILING Round towards Infinity.
  • decimal.ROUND_DOWN Round towards zero.
  • decimal.ROUND_FLOOR Round towards -Infinity.
  • decimal.ROUND_HALF_DOWN Round to nearest with ties going towards zero.
  • decimal.ROUND_HALF_EVEN Round to nearest with ties going to nearest even integer.
  • decimal.ROUND_HALF_UP Round to nearest with ties going away from zero.
  • decimal.ROUND_UP Round away from zero.
  • decimal.ROUND_05UP Round away from zero if last digit after rounding towards zero would have been 0 or 5; otherwise round towards zero.

  • Context objects decimal.getcontext() Return the current context for the active thread. decimal.setcontext(c) Set the current context for the active thread to c.