Pythonで数値計算を行う際、浮動小数点数の誤差が問題となることがあります。この記事では、その誤差の原因と対処法について解説します。
浮動小数点数の誤差の原因
浮動小数点数の誤差は、コンピュータが数値を2進数で表現するために生じます。例えば、0.1
という10進数は、2進数では無限に続く循環小数となり、コンピュータはこれを有限の桁数で近似して表現します。この結果、0.1
や0.3
などの値が正確に表現できず、誤差が生じるのです。
対処法
Pythonでは、このような誤差を回避するためにdecimal
モジュールやfractions
モジュールを使用することができます。
decimalモジュール
decimal
モジュールを使用すると、10進数の小数を正確に計算することができます。以下に例を示します。
from decimal import Decimal
print(Decimal('0.1')+Decimal('0.2')) # 0.3
print(Decimal('0.1')*Decimal('0.2')) # 0.02
fractionsモジュール
fractions
モジュールを使用すると、分数として計算を行うことができ、割り算の結果も正確に得ることができます。以下に例を示します。
from fractions import Fraction
print(float(Fraction('0.1')+Fraction('0.2'))) # 0.3
print(float(Fraction('1')/(Fraction('1')/Fraction('60')))) # 60.0
ただし、最終的にはfloat型に直すことがほとんどかと思いますので、その際に誤差が発生します。
まとめ
Pythonで数値計算を行う際には、浮動小数点数の誤差に注意が必要です。しかし、decimal
モジュールやfractions
モジュールを適切に使用することで、これらの誤差を回避することが可能です。計算の内容によって適切なモジュールを選択し、正確な数値計算を行いましょう。.