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'でも問題ありません。小文字と大文字の区別はなく、小文字と大文字が混ざっていても問題ない。

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() --- 数学関数 — Python 3.7.1rc1 ドキュメント

math.isinf()は負の無限大に対してもTrueを返します。

print(math.isinf(1e1000))
# True

print(math.isinf(1e100))
# False

print(math.isinf(-1e1000))
# True

np.isinf()

NumPyにもmathと同様にnp.isinf()があります。

numpy.isinf — NumPy v1.15 Manual

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
Last Updated: 6/26/2019, 10:34:03 PM