Pythonの浮動小数点数float型の範囲(最大値・最小値)
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ではfloat32
やfloat64
のように末尾に明示的にビット数を付けて型を指定できる。
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