Pythonで無限大を表すinfの作成・演算・判定・比較
Pythonの浮動小数点数float
型には無限大を表すinf
がある。inf
の作成方法およびinf
を含む演算、判定、比較について説明する。
- 浮動小数点数
float
型の無限大inf
- 負の無限大
- 他の型への変換
- 無限大
inf
の作成float()
で作成float
型の最大値を超える浮動小数点数- 標準ライブラリのmathモジュール:
math.inf
- NumPy:
np.inf
- 無限大
inf
を含む演算 - 無限大
inf
の判定:==
,math.isinf()
,np.isinf()
==
演算子math.isinf()
np.isinf()
- 無限大
inf
の比較- 浮動小数点数
float
との比較 nan
との比較- 整数
int
との比較
- 浮動小数点数
浮動小数点数float型の無限大inf
Pythonでは浮動小数点数float
型に無限大を表すinf
がある。
コンストラクタfloat()
の引数に文字列'inf'
を指定すると生成できる。その他の生成方法については後述。
f_inf = float('inf')
print(f_inf)
# inf
print(type(f_inf))
# <class 'float'>
負の無限大
無限大inf
に-
をつけると負の無限大を表せる。
f_inf_minus = -float('inf')
print(f_inf_minus)
# -inf
print(type(f_inf_minus))
# <class 'float'>
他の型への変換
通常のfloat
型の値はint()
で整数int
型に変換できるが、inf
は変換できない。
# print(int(f_inf))
# OverflowError: cannot convert float infinity to integer
なお、Python3では整数int
型には上限はない。
文字列str
型にはstr()
で変換可能。
print(str(f_inf))
# inf
print(type(str(f_inf)))
# <class 'str'>
無限大infの作成
inf
を作成する方法はいくつかある。
float()で作成
上の例のように、コンストラクタfloat()
に文字列'inf'
を指定するとfloat
型のinf
が作成できる。
'infinity'
でもOK。小文字と大文字の区別はなく、小文字と大文字が混ざっていても問題ない。
print(float('inf'))
# inf
print(float('infinity'))
# inf
print(float('INF'))
# inf
print(float('INFinity'))
# inf
float型の最大値を超える浮動小数点数
float
型が取り得る最大値を超える浮動小数点数は自動的にinf
として扱われる。
import sys
f_inf_num = sys.float_info.max * 2
print(f_inf_num)
# inf
ここではsys.float_info.max
でfloat
型の最大値を取得している。詳細は以下の記事を参照。
標準ライブラリのmathモジュール: math.inf
標準ライブラリのmathモジュールをインポートするとmath.inf
としてinf
を作成可能。特別な型ではなくfloat
型のinf
が作成される。
import math
print(math.inf)
# inf
print(type(math.inf))
# <class 'float'>
print(float('inf') == math.inf)
# True
NumPy: np.inf
mathモジュールと同じく、サードパーティライブラリのNumPyでもinf
を作成可能。こちらも特別な型ではなくfloat
型のinf
が作成される。
import numpy as np
print(np.inf)
# inf
print(type(np.inf))
# <class 'float'>
print(float('inf') == np.inf)
# True
無限大infを含む演算
無限大inf
に対しても四則演算(足し算、引き算、掛け算、割り算)およびべき乗が可能。
和
無限大inf
には何を足しても無限大inf
。
print(float('inf') + 100)
# inf
print(float('inf') + float('inf'))
# inf
差
無限大inf
から無限大inf
を引くとnan
となる。nan
はNot a Number
の略で非数を表す。nan
もfloat
型の値。
それ以外の値を引いても無限大inf
のまま。
print(float('inf') - 100)
# inf
print(float('inf') - float('inf'))
# nan
print(type(float('inf') - float('inf')))
# <class 'float'>
積
無限大inf
に0を掛けるとnan
。それ以外は無限大inf
。
print(float('inf') * 2)
# inf
print(float('inf') * float('inf'))
# inf
print(float('inf') * 0)
# nan
商
無限大inf
を無限大inf
で割るとnan
。0
を無限大inf
で割ると0
。0
で割るとエラー。それ以外は無限大inf
。
print(float('inf') / 2)
# inf
print(float('inf') / float('inf'))
# nan
print(0 / float('inf'))
# 0.0
# print(float('inf') / 0)
# ZeroDivisionError: float division by zero
べき乗
無限大inf
の0
乗は1
。1
の無限大inf
乗は1
。0
の無限大inf
乗は0
。それ以外は無限大inf
。
print(float('inf') ** 2)
# inf
print(float('inf') ** float('inf'))
# inf
print(float('inf') ** 0)
# 1.0
print(2 ** float('inf'))
# inf
print(1 ** float('inf'))
# 1.0
print(0 ** float('inf'))
# 0.0
無限大infの判定: ==, math.isinf(), np.isinf()
float
型の最大値を超える値(=無限大)と範囲内の値(≠無限大)を例とする。eXXX
は10
のXXX
乗の意味。
import math
import numpy as np
print(1e1000)
# inf
print(1e100)
# 1e+100
==演算子
ある値が無限大inf
であるかどうかは==
で判定可能。
print(1e1000 == float('inf'))
# True
print(1e100 == float('inf'))
# False
無限大inf
を作成する方法はいくつかあるが、すべて同じfloat
型の値であるので、どれを使っても問題ない。
print(float('inf') == math.inf == np.inf)
# True
print(1e1000 == math.inf)
# True
print(1e100 == math.inf)
# False
また、上述のように、無限大inf
の演算結果の多くは無限大inf
となるため、以下のような判定結果もTrue
となる。
print(float('inf') == float('inf') * 100)
# True
math.isinf()
mathモジュールには関数math.isinf()
が用意されている。
math.isinf()
は負の無限大に対してもTrue
を返す。
print(math.isinf(1e1000))
# True
print(math.isinf(1e100))
# False
print(math.isinf(-1e1000))
# True
np.isinf()
NumPyにもmathと同様にnp.isinf()
がある。
np.isinf()
も負の無限大に対してもTrue
を返す。
print(np.isinf(1e1000))
# True
print(np.isinf(1e100))
# False
print(np.isinf(-1e1000))
# True
np.isinf()
は引数にNumPy配列ndarray
を指定可能。正負の無限大inf
である要素がTrue
、それ以外はFalse
となる同じサイズのndarray
を返す。
a_inf = np.array([1, np.inf, 3, -np.inf])
print(a_inf)
# [ 1. inf 3. -inf]
print(type(a_inf))
# <class 'numpy.ndarray'>
print(np.isinf(a_inf))
# [False True False True]
この結果を利用して、無限大inf
である要素を別の値に置換することが可能。
a_inf[np.isinf(a_inf)] = 0
print(a_inf)
# [1. 0. 3. 0.]
nan
を置換する場合と考え方は同じ。
無限大infの比較
比較演算子>
, <
で無限大inf
を他の値と比較できる。
無限大inf
はfloat
およびint
の値と比較可能で、nan
を除くどの値よりも大きい(nan
との比較はすべてFalse
)。
以下に具体例を示す。
浮動小数点数floatとの比較
float
型が取り得る最大値を例とする。
無限大inf
はfloat
型が取り得る最大値よりも大きく、負の無限大はfloat
型が取り得る最小値よりも小さい。
import sys
print(sys.float_info.max)
# 1.7976931348623157e+308
print(float('inf') > sys.float_info.max)
# True
print(-float('inf') < -sys.float_info.max)
# True
nanとの比較
float
型の特殊な値である非数nan
の場合。nan
はfloat('nan')
で生成できる。
print(float('nan'))
# nan
print(type(float('nan')))
# <class 'float'>
nan
との比較は>
, <
, ==
すべての場合でFalse
となる。
print(float('inf') > float('nan'))
# False
print(float('inf') < float('nan'))
# False
print(float('inf') == float('nan'))
# False
整数intとの比較
整数int
型との比較も可能。
print(float('inf') > 100)
# True
Python3では整数int
の上限がないため、float
の最大値を超える値を格納することも可能だが、無限大inf
はそのような値よりも大きい。
large_int = int(sys.float_info.max) * 10
print(large_int)
# 1797693134862315708145274237317043567980705675258449965989174768031572607800285387605895586327668781715404589535143824642343213268894641827684675467035375169860499105765512820762454900903893289440758685084551339423045832369032229481658085593321233482747978262041447231687381771809192998812504040261841248583680
print(type(large_int))
# <class 'int'>
print(large_int > sys.float_info.max)
# True
print(float('inf') > large_int)
# True
なお、float
の最大値以下の整数int
の値はfloat()
でfloat
に変換できるが、float
の最大値を超える整数int
の値は変換できないので注意。
print(float(10**308))
# 1e+308
# print(float(10**309))
# OverflowError: int too large to convert to float