【Python】FloatingPointErrorとは?発生原因や対処法・回避方法を解説

この記事では、PythonにおけるFloatingPointError(浮動小数点エラー)の発生原因や対処法、回避方法について解説します。

初心者の方でもわかりやすく、具体的なサンプルコードと実行結果の例を交えて説明します。

目次から探す

FloatingPointErrorとは?

FloatingPointError(浮動小数点エラー)は、プログラミング言語Pythonにおいて、浮動小数点数の計算に関連するエラーを指します。

浮動小数点数は、実数を近似的に表現するための方法であり、計算の精度に制約があります。

そのため、特定の条件下で誤差が生じ、FloatingPointErrorが発生することがあります。

浮動小数点数の詳細な仕組みや計算の精度については、ここでは詳しく説明しません。

FloatingPointErrorは、プログラムの実行中に以下のようなエラーメッセージとして表示されることがあります。

Traceback (most recent call last):
  File "example.py", line 5, in <module>
    result = 1 / 0
ZeroDivisionError: division by zero

この例では、0除算によってZeroDivisionErrorが発生していますが、0除算はFloatingPointErrorの一種です。

FloatingPointErrorの対処法

浮動小数点演算によって発生するFloatingPointErrorを避けるためには、いくつかの対処法があります。

以下では、それぞれの対処法について詳しく解説します。

誤差を許容する方法

浮動小数点演算は、厳密な計算ができないため、誤差が生じることがあります。

この誤差を許容する方法として、丸めや桁数の制限を行う方法があります。

Pythonでは、round()関数を使用して丸めることができます。

また、decimalモジュールを使用することで、より正確な計算が可能です。

以下は、round()関数を使用して誤差を許容する例です。

result = round(0.1 + 0.2, 1)
print(result)  # 出力: 0.3

0除算の回避方法

0除算はFloatingPointErrorを引き起こす一つの原因です。

0で割ることは数学的には定義されていないため、エラーが発生します。

0除算を回避するためには、事前に0で割る可能性をチェックする必要があります。

以下は、0除算を回避する例です。

numerator = 10
denominator = 0
if denominator != 0:
    result = numerator / denominator
    print(result)
else:
    print("0除算は回避されました")

オーバーフローまたはアンダーフローの回避方法

数値のオーバーフローまたはアンダーフローもFloatingPointErrorの原因となります。

オーバーフローは、計算結果が浮動小数点数の表現範囲を超える場合に発生し、アンダーフローは、計算結果が浮動小数点数の表現範囲を下回る場合に発生します。

オーバーフローまたはアンダーフローを回避するためには、数値の範囲を制限する必要があります。

Pythonでは、sys.float_infoを使用して、浮動小数点数の範囲を取得することができます。

以下は、オーバーフローまたはアンダーフローを回避する例です。

import sys
max_value = sys.float_info.max
min_value = sys.float_info.min
result = max_value * 2
print(result)  # 出力: inf
result = min_value / 2
print(result)  # 出力: 0.0

NaNやinfの扱い方

浮動小数点演算によってNaN(非数)やinf(無限大)が生成されることがあります。

これらの特殊な値を適切に扱うためには、mathモジュールやnumpyライブラリを使用することができます。

以下は、NaNやinfを扱う例です。

import math
import numpy as np
result = math.sqrt(-1)
print(result)  # 出力: nan
result = np.log(0)
print(result)  # 出力: -inf

以上がFloatingPointErrorの対処法です。

これらの対処法を適切に使用することで、FloatingPointErrorを回避することができます。

1 2

この記事のページ一覧
  1. 現在のページ
目次から探す