はじめに
浮動小数点数の計算は、微妙な誤差が生じることがあります。
これはPythonというかCPUの性質に起因するものです。
この記事ではPythonでいい感じに取り扱うための方法を書いていきます。
Pythonでの挙動とその誤差
Pythonで以下のようなコードを実行します。
a = 0.33
b = 10
print(a * b)
0.33に10を掛けるだけの単純なものです。
実行するとこんな感じ。
ごく僅かですが、誤差がありますよね。
これは当然の話で、現代のCPUにおいては精度に関する微小な誤差が生じてしまいます。
これは、コンピュータが有限の精度で実数を表現するために起こります。
(IEEE 754規格では2**53以上の整数値を表現できないため)
Pythonの場合も同様で、例えば0.1のような値は内部的には完全な2進数で表現され、無限小数ではなく近似値として保存されます。
俗に言う浮動小数点ってやつです。
端的に言ってしまえば、内部的な計算はすべて2進数のもと行われているので、10進数を前提とした計算は難しいよ~ってお話です。
精度をあげるには
実はdecimalという10進数の浮動小数点のための計算を行うために設計されている標準ライブラリを用いることでより精確な計算ができるようになります。
ちゃんと動きますよね。
ちなみにこれは、float型からDecimal型にキャストするとうまくいきません。
float型は近似値を渡してしまうようで、その近似値をそのまま読んでしまうため、こうなったものと考えられます。
一度strに変換した後、読み込んであげるとうまくいきます。
ですが、decimal型は十進小数を正確に表現できるものであって、全ての実数を正確に表現できるわけではないことに注意する必要があります。
詳しく知りたい方はここを参考にしてください。
さいごに
浮動小数点数の計算は、特に大規模な数値計算や高精度が求められる場面では注意が必要です。
decimalを使ってあげることで、精度を向上させることができますが、限界があります。
この記事が誰かのお役に立てれば幸いです。
それでは。