ゼロ除算

ゼロ除算

ゼロ除算

 ゼロ除算 (division by zero) とは、ある数値を 0 で割る演算を意味します。よく知られているように、数学においてゼロ除算は定義されない演算なので、多くのプログラミング言語においてもゼロ除算を実行するとエラーまたは NaN (Not a Number : 非数) が返るように設計されています。Python ではゼロ除算に対して ZeroDivisionError が発生します。

# ZDV_01

# ゼロ除算を実行
print(1/0)
ZeroDivisionError: division by zero

 

NumPyにおけるゼロ除算

 ゼロ除算に対してエラーではなく特殊な値を返すように設計されている拡張パッケージもあります。たとえば、NumPy ではゼロ除算に対して numpy.inf という値を返します。

# ZDV_02

# NumPyをインポート
import numpy as np

# 1次元配列を作成
x = np.array([1, 2, 3])

# 配列xに対してゼロ除算を実行
y = x / 0

print(y)
[inf inf inf]
RuntimeWarning: divide by zero encountered in true_divide

 numpy.inf は無限大を表す特殊値であり、ゼロ除算を「割る数 (分母) を正方向から 0 に近づける右側極限操作」と設定しています。ただし上の実行結果にあるように、0 で割っていることを示す警告文も添えられます。これはユーザーが意図しないゼロ除算を知ることができるようにとの配慮だと考えられます 。
 

ゼロ除算の戻り値にinfを設定

 NumPy を使っていなくても、ゼロ除算に対してエラーではなく inf を返すようにしたいと考えるかもしれません。そのような場合には、たとえば次のような除算関数を定義します。

# ZDV_03

# 除算関数を定義
def div(a, b):
    if b == 0:
        return a * float("inf") / abs(a)
    else:
        return a / b

# -5/0を計算
x = div(-5, 0)

print(x)
-inf

 a を掛けて a の絶対値で割っているのは、a の符号を戻り値に反映させるためです。すなわち div(5, 0) は inf を返し、div(-5, 0) は -inf を返します。
 

ゼロ除算の戻り値にnanを設定

 ゼロ除算を意味のない演算であると考えるなら、戻り値を nan (not a number : 非数) に設定するという方法もあります。これは実質的に inf よりもエラーに近い設定です。Python 本体には特殊浮動小数点数として nan が組み込まれており、float('nan') で呼び出すことができます。

# ZDV_04

# 除算関数を定義
def div_2(a, b):
    if b == 0:
        return float("nan")
    else:
        return a / b

# 1/0を計算
x = div_2(1, 0)

print(x)
nan