float?Decimal?Sympy?浮動小数点演算

float?Decimal?Sympy?

浮動小数点演算

参考:

[1] Pythonで小数点以下の計算結果

[2] 9.4. decimal — 十進固定及び浮動小数点数の算術演算

[3] 9.5. fractions — 有理数

[4] 15. 浮動小数点演算、その問題と制限

[5] Sympy

実際的には,有効数字の話だから,余り意識せずに処理していたけど,考えてみると深い.というかよく分かっていなかったのでちょこちょこっと.参考が上に来ているのは,例によって,考えながら書いているから.纏まった情報ではない(注意).

計算上の精度(数学的合理性)の話と表示上の精度(有効数字;工学的合理性)の話はちょっと分けて考えるべきで,計算上の精度,という話であれば,任意精度で処理したければ,整数に変換できるなら整数に変換して計算するか,[4]に書かれている様にSympyを使うべきなんだろう([1]のコメント欄でも,SaitoTsutomuさんのコメントがそうだけど,その様に書かれている).ちなみに,「fractions」は結局二進浮動小数点数での処理なので,floatで計算するのと何も変わらない[4].なので,計算上の精度と云う意味では意味がなくて,例えば「Fraction(1) / Fraction(3) * Fraction(3)」は「1 / 3 * 3」と変わらないし,有効数字の話であれば,例えば「1/3」も「0.3(format(1/3, ‘.1f’))」も同じなので,fractionsモジュールを使う理由は余りないので,ここでは考えない.

例: 0.1 + 0.1 + 0.1

>>>0.1 + 0.1 + 0.1

0.30000000000000004

>>>float(format(0.1+0.1+0.1, ‘.1f’))

0.3

>>>round(0.1 + 0.1 + 0.1, 1)

0.3

>>>import decimal

>>>D = decimal.Decimal

>>>D(‘0.1’) + D(‘0.1’) + D(‘0.1’)

Decimal(‘0.3’)

>>>from sympy import Rational

>>>Rational(1, 10) + Rational(1, 10) + Rational(1, 10)

3/10

>>>from sympy import Float

>>>Float(0.1) + Float(0.1) + Float(0.1)

0.300000000000000

>>>Float(Rational(1, 10) + Rational(1, 10) + Rational(1, 10))

0.300000000000000

>>>Float(Rational(0.1) + Rational(0.1) + Rational(0.1))

0.300000000000000

例: 1 / 3 * 3

>>>1 / 3 * 3

1.0

>>>int(format(1 / 3 * 3, ‘1g’))

1

>>>round(1 / 3 * 3)

1

>>>D(‘1’) / D(‘3’) * D(‘3’)

Decimal(‘0.9999999999999999999999999999’)

>>>float(D(‘1’) / D(‘3’) * D(‘3’))

1.0

>>>Rational(1) / Rational(3) * Rational(3)

1

>>>Float(1) / Float(3) * Float(3)

1.00000000000000

例: 1 / 3

>>>1 / 3

0.3333333333333333

>>>float(format(1/3, ‘.1f’))

0.3

>>>round(1/3, 1)

0.3

>>>D(‘1’) / D(‘3’)

Decimal(‘0.3333333333333333333333333333’)

>>>Rational(1) / Rational(3)

1/3

>>>Float(1) / Float(3)

0.333333333333333

以上から,数学的合理性を考えるなら,Sympy使えって話で(Decimalも任意精度の様なので,使いこなせば高精度で計算ができるんだろうけど,有効桁とかどうも意図した感じの結果にならない部分があったのでSympyの方が良いと思う),工学的合理性,つまりは有効数字の話であれば,Decimal使おうとfloat使おうと同じで,どう”適切に”処理するかだけの話に過ぎないって事じゃないかな.

カテゴリー: 未分類 パーマリンク

float?Decimal?Sympy?浮動小数点演算 への2件のフィードバック

  1. ピンバック: Pythonで有効数字 | 粉末@それは風のように (日記)

  2. ピンバック: 浮動小数点演算に於ける誤差 | 粉末@それは風のように (日記)

コメントは受け付けていません。