ゼロで割るとどうなるかは言語によります。
R で 1 / 0
と打ち込むと Inf
(Infinity = 無限大)と返ってきます。0 / 0
は NaN
(Not a Number = 非数)になります。いずれにしても、エラーで止まることはありません。
Ruby では 1 / 0
や 0 / 0
は ZeroDivisionError になって止まりますが 1.0 / 0.0
は Infinity
、0.0 / 0.0
は NaN
になります。C言語でも同じです。
ところが Python では 0
で割っても 0.0
で割っても ZeroDivisionError になり、そこで実行が止まってしまいます。これでは不便です。もちろん
try: x = a / b except ZeroDivisionError: if a == 0: x = float("nan") else: x = float("inf")
のようなことはできますが、面倒です。
NumPy の数値(array の要素など)であれば大丈夫です:
import numpy as np a = np.array([1, 0, 0]) print(a[0] / a[1]) print(a[1] / a[2])
inf nan
配列の要素でない数の場合は np.float64(0)
のようにします。np.array(0)
でもかまいません。
ただし、RuntimeWarning(実行時の警告)が出ます。RuntimeWarning を出したくなければ、あらかじめ
np.seterr(divide="ignore", invalid="ignore")
と打ち込んでおきます(invalid とは 0/0 のこと)。元に戻すには
np.seterr(divide="warn", invalid="warn")
とします(詳しくは np.seterr
のヘルプ参照)。
特定の割り算だけ warn しないようにするには
with np.errstate(divide="ignore", invalid="ignore"): x = a / b
のようにします。