【inf】Pythonでの無限大の扱いを解説

Python

Pythonにおける「inf」は、無限大(Infinity)を表す際に用いられる値です。具体的には、正の無限大をfloat(‘inf’)やmath.infとして表すことができます。また、負の無限大を表す場合にはfloat(‘-inf’)-math.infを使います。以下では、その詳細と注意点を解説します。

Pythonで無限大を表す方法

float(‘inf’) / float(‘-inf’)

文字列‘inf’‘-inf‘をfloat()で変換すると、それぞれ正の無限大、負の無限大を表すfloatオブジェクトを得られます。

pos_inf = float('inf')
neg_inf = float('-inf')

print(pos_inf)  # inf
print(neg_inf)  # -inf

math.inf

Pythonの標準ライブラリmathには、無限大を表す定数math.infが用意されています。 こちらはfloat(‘inf’)と同じ意味合いを持ちます。

import math

pos_inf = math.inf
neg_inf = -math.inf

print(pos_inf)  # inf
print(neg_inf)  # -inf

decimalモジュールでのInfinity

より正確な小数計算を行うためのdecimalモジュールでも、同様に無限大を扱うことができます。Decimal型で無限大を作りたい場合、次のようにします。

from decimal import Decimal

pos_inf_decimal = Decimal('Infinity')
neg_inf_decimal = Decimal('-Infinity')

print(pos_inf_decimal)  # Infinity
print(neg_inf_decimal)  # -Infinity

floatと同様に大小比較などが可能ですが、decimalの文脈内で演算される点に注意してください。floatとの混在に注意が必要です。


なぜ使うのか?

無限大の値は、以下のような場面で利用されることがあります。

初期値の設定

ある最小値や最大値を求めるアルゴリズムで、まだ値を一切取得していない状態を“無限大”で初期化しておくと便利です。

例えば、以下のようにリスト内の最小値を求める際にfloat(‘inf’)を初期値として使用すると、1回目の比較で必ず更新されるため便利です。

numbers = [42, 17, 68, 29, 5, 91, 33]

# 最小値を探す
min_value = float('inf')  # 初期値として正の無限大を設定

for num in numbers:
    if num < min_value:
        min_value = num  # より小さい値が見つかれば更新

print("最小値:", min_value)  # 出力: 最小値: 5

エラー状態の表現

何らかの計算結果が定義できない場合や、分母が0になってしまうケースなどでは、エラーの代わりに無限大を返して「発散状態」を示すことがあります。

def compute_ratio(a, b):
    if b == 0:
        # 分母が0の場合は無限大などでエラーを表現
        if a > 0:
            return float('inf')
        elif a < 0:
            return float('-inf')
        else:
            return float('nan')
    return a / b

val1 = compute_ratio(10, 0)
val2 = compute_ratio(-5, 0)
val3 = compute_ratio(0, 0)

print(val1)  # inf
print(val2)  # -inf
print(val3)  # nan
  • 分母が0のとき、正の値ならinf、負の値なら -inf、それ以外はnanを返しています。
  • float(‘nan’)やmath.nanは同じnan同士でも等価にならない特性(nan == nanFalse)に注意してください。

無限大を用いた比較・演算

Pythonのfloat型における無限大は、通常の数値と同様に演算・比較が可能です。

pos_inf = float('inf')
neg_inf = float('-inf')

print(pos_inf > 1000000)     # True
print(neg_inf < -1000000)    # True

print(pos_inf + 100)         # inf
print(neg_inf - 100)         # -inf

# 無限大同士の演算
print(pos_inf + neg_inf)     # nan (数値として定義できない Not a Number)
print(pos_inf * 0)           # nan (数学的には不定形)
  • 有限値 < 無限大 < 負の無限大 が成り立つことはなく、実際には以下のようになります。
    • 任意の有限正数 < inf
    • 任意の有限負数 > -inf
  • inf+(-inf)のような演算は、不定形(定義できない)となり、nan(Not a Number)となります。
  • 無限大に0を掛ける演算(inf0-inf0)も、やはり不定形となるためnanです。

注意点

比較演算におけるinfの扱い

無限大はあくまで「非常に大きい値」ではなく、“数学的に無限大”を表していると考えた方が安全です。

最適化やアルゴリズムで便宜的に使う場合は、予期しない演算結果(たとえばinf-infがnanになる等)にならないか注意が必要です。

nanの存在

無限大と負の無限大の演算、無限大に0を掛ける演算などでnan(Not a Number)になることがあります。これは浮動小数点演算において定義できない値を表します。

  • math.isnan()float(‘nan’)を使うとnanのチェックや生成ができます。
  • nanは比較演算で常に偽(False)になる特性があるため、バグの原因になりやすいです。
  • math.nanfloat(‘nan’)は、他の数値どころか同じnan同士でも等価(==)と判断されません。
import math

print(math.nan == math.nan).          # True
print(float('nan') == float('nan')).  # True

decimalの場合のスケール

decimalではコンテキストによって精度や丸めが設定されますが、Infinityはそのコンテキストの影響を受けません。Decimal(‘Infinity’)+Decimal(‘1’)の結果は依然としてInfinityとなります。


まとめ

  • float(‘inf’)やmath.infは、Pythonにおける正の無限大を表します。負の無限大はfloat(‘-inf’)または-math.infを使用します。
  • 比較・演算ができるものの、無限大同士や無限大と0の演算はnanになる可能性があり、扱いには注意が必要です。
  • アルゴリズムの初期値や数学的な表現のために使われることが多いです。

無限大を適切に使うことで、境界値処理やエラーの表現がシンプルに書けるようになります。ただし、無限大による演算は「不定形(nan)の発生」など気をつける点があるため、使う際はロジックを十分確認しましょう。

タイトルとURLをコピーしました