無限大と非数

無限大と非数

無限大と非数

 Pythonでは float() の引数に文字列で "inf" あるいは "infinity" を渡すと、inf というオブジェクトが返ります。"-inf" もしくは "-infinity" という文字列を渡すと、-inf というオブジェクトが返ります。

# https://python.atelierkobato.com/infinity/

# 正の無限大
x = float("inf")

# 負の無限大
y = float("-inf")

print("x =", x)
print("y =", y)

# x, yのクラスを判定
print(type(x),type(y))
x = inf
y = -inf
<:class 'float'> <class 'float'>

 inf-inf は、それぞれ解析学(微分積分学)でいうところの正の無限大負の無限大に相当します。
 

無限大の演算

 inf と -inf は floatクラスのオブジェクトなので、算術演算子を使って inf 同士、あるいは他の数値と演算させることが可能ですが、その戻り値が inf, -inf, nan などになることがあります。nan とは not a number (非数) の略で、解析学(微分積分学)の不定形に相当します。

# https://python.atelierkobato.com/infinity/

# 正の無限大の定義
x = float("inf")

# ∞ + 1
a = x + 1

# ∞ / ∞
b = x / x

# 1 / ∞
c = 1 / x

# ∞ - ∞
d = x - x

# (-1) × ∞
e = -1 * x

# 変数を辞書に格納
my_dic = {"a =":a, "b =":b, "c =":c, "d =":d, "e =":e}

for k in my_dic:
    print(k, my_dic[k])
a = inf
b = nan
c = 0
d = nan
e = -inf

 

有限数/無限大/非数の判定

 math.isfinite(x) は x が inf, -inf, nan のいずれでもないときに True を返し、それ以外のときには False を返します。math.isinf(x) は x が inf または -inf であるときに True を返し、それ以外のときには False を返します。math.isnan(x) は x が nan のときにのみ True を返します。それ以外は False を返します。

# https://python.atelierkobato.com/infinity/

# mathをインポート
import math

# 正の無限大の定義
x = float("inf")

# 負の無限大の定義
y = float("-inf")

# 非数の定義
z = float("nan")

# x, y, z は有限数?
print(math.isfinite(x), math.isfinite(y), math.isfinite(z))

# x, y, z は無限?
print(math.isinf(x), math.isinf(y), math.isinf(z))

# x, y, z は非数?
print(math.isnan(x), math.isnan(y), math.isnan(z))
False False False
True True False
False False True

 

NumPy を活用した無限大の演算

numpy.inf, numpy.NINF

 Numpy をインポートすると、正の無限大と負の無限大を numpy.inf, numpy.NINF という名前で扱うことができるようになります。

# https://python.atelierkobato.com/infinity/

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

# ∞ / ∞
a = np.inf / np.inf

# 1 / ∞
b = 1 / np.inf

# ∞ - ∞
c = np.inf + np.NINF

# 変数を辞書に格納
my_dic = {"a =":a, "b =":b, "c =":c}

for k in my_dic:
    print(k, my_dic[k])
a = nan
b = 0.0
c = nan

 ∞ から ∞ を引いても 0 にならないことに注意!
 

有限数/無限大/非数の判定

 numpy.isfinite(), numpy.isinf(), numpy.isnan() を使うと、それぞれ有限数、無限大、非数を判定することができます。NumPy なので引数に配列 (ndarray) を渡してまとめて判定処理できます。

# https://python.atelierkobato.com/infinity/

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

# +∞, -∞, 非数, 有限数を配列に格納
num_array = np.array([np.inf, np.NINF, np.nan, 1])

# 各要素は有限数?
x = np.isfinite(num_array)

# 各要素は無限大
y = np.isinf(num_array)

# 各要素は非数(不定形)?
z = np.isnan(num_array)

print("各要素は有限数?", x)
print("各要素は無限大?", y)
print("各要素は非数?", z)
各要素は有限数? [False False False True]
各要素は無限大? [True True False False]
各要素は非数? [False False True False]