Pythonの浮動小数点数float型の範囲(最大値・最小値)

Modified: | Tags: Python, 数値

Pythonの浮動小数点数float型は64ビットの浮動小数点数表現である倍精度浮動小数点数で、Cなどほかのプログラミング言語におけるdoubleに相当する。

Pythonのfloat型が取り得る範囲(最大値・最小値)を取得・確認する方法について説明する。

先に結果を書いておくと、多くの環境では以下の範囲となる。e+XXXは10のXXX乗の意味。

-1.7976931348623157e+308 <= f <= 1.7976931348623157e+308

なお、整数int型には上限がない。

また、float型には特殊な値として無限大を表すinfもある。

Pythonのfloatは倍精度浮動小数点数(double)

公式ドキュメントにあるように、Pythonの浮動小数点数float型はC言語のdoubleを使って実装されている。

浮動小数点型はたいていは C の double を使って実装されています
組み込み型 — Python 3.11.4 ドキュメント

「たいてい」とあるが、特殊な実装の環境だという認識がなければdoubleだと思って恐らく問題ない。後述のsys.float_infoを使えば実際の精度を確認できる。

doubleは倍精度浮動小数点数で64ビットの浮動小数点数表現。

C言語など、ほかの多くのプログラミング言語では32ビットの浮動小数点数表現である単精度浮動小数点数をfloat、倍精度浮動小数点数をdoubleとして使い分けるが、Pythonでは倍精度をfloatと呼び単精度の型はない。

なお、NumPyではfloat32float64のように末尾に明示的にビット数を付けて型を指定できる。

float型の情報を取得: sys.float_info

float型の詳細な情報を取得するにはsys.float_infoを使う。

sysモジュールは標準ライブラリに含まれているので追加のインストールは必要ない(importは必要)。

import sys

print(sys.float_info)
# sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)

print(type(sys.float_info))
# <class 'sys.float_info'>

各項目の値はsys.float_info.<項目名>のように取得できる。

print(sys.float_info.max)
# 1.7976931348623157e+308

項目の一覧とその内容は公式ドキュメントを参照。各項目がC言語の標準ヘッダファイルfloat.hで定義されている浮動小数点定数に対応している。

以下に転載する。

属性 float.hのマクロ 説明
epsilon DBL_EPSILON 1と、その次の表現可能なfloat値の差
dig DBL_DIG 浮動小数点数で正確に表示できる最大の10進数桁
mant_dig DBL_MANT_DIG 浮動小数点精度: 浮動小数点数の主要部の桁 base-radix
max DBL_MAX floatが表せる最大の(infiniteではない)値
max_exp DBL_MAX_EXP floatが radix**(e-1) で表現可能な、最大の整数 e
max_10_exp DBL_MAX_10_EXP float が 10**e で表現可能な、最大の整数 e
min DBL_MIN 正規化 float の最小の正の値
min_exp DBL_MIN_EXP radix**(e-1) が正規化floatであるような最小の整数 e
min_10_exp DBL_MIN_10_EXP 10**e が正規化floatであるような最小の整数 e
radix FLT_RADIX 指数部の基数
rounds FLT_ROUNDS 算術演算で利用される丸めモードを表す整数定数

float型で表せる最大値: sys.float_info.max

float型で表せる最大値はsys.float_info.maxで取得できる。e+XXXは10のXXX乗の意味。

import sys

print(sys.float_info.max)
# 1.7976931348623157e+308

これを超える値は無限大を表すinfとなる。infについての詳細は以下の記事を参照。

print(1.8e+308)
# inf

print(type(1.8e+308))
# <class 'float'>

float型で表せる最大値を16進数で表現すると以下の通り。

print(sys.float_info.max.hex())
# 0x1.fffffffffffffp+1023

浮動小数点数と16進数の文字列との相互変換については以下の記事を参照。上の例のようにpを含む形式ではないシンプルな16進数の文字列への変換についても説明している。

float型で表せる最小値

負の最小値

float型で表せる負の最小値はsys.float_info.max-を付けた値。それより小さい値は負の無限大となる。

import sys

print(-sys.float_info.max)
# -1.7976931348623157e+308

print(-1.8e+308)
# -inf

print(type(-1.8e+308))
# <class 'float'>

正の最小値(正規化数): sys.float_info.min

正規化数の正の最小値はsys.float_info.minで取得できる。

import sys

print(sys.float_info.min)
# 2.2250738585072014e-308

正規化数は指数部が0でない値。sys.float_info.minは16進数文字列で以下のように表される。

print(sys.float_info.min.hex())
# 0x1.0000000000000p-1022

正の最小値(非正規化数)

上述のsys.float_info.minは正規化数の正の最小値。

指数部が0で仮数部は0でない値は非正規化数と呼ばれる。

非正規化数の正の最小値は16進数の文字列から変換して以下のように確認できる。

print(float.fromhex('0x0.0000000000001p-1022'))
# 5e-324

print(format(float.fromhex('0x0.0000000000001p-1022'), '.17'))
# 4.9406564584124654e-324

この値より小さい値は0.0となる。

print(1e-323)
# 1e-323

print(1e-324)
# 0.0

Python3.9以降は、新たに追加されたmath.ulp()0.0を指定することでも非正規化数の正の最小値を取得できる。

import math

print(math.ulp(0.0))
# 5e-324

print(format(math.ulp(0.0), '.17'))
# 4.9406564584124654e-324
source: math_ulp.py

関連カテゴリー

関連記事