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

Pythonの浮動小数点数float型は64ビットの浮動小数点数表現である倍精度浮動小数点数で、Cなどほかのプログラミング言語におけるdoubleに相当します。 Pythonのfloat型が取りうる範囲(最大値・最小値)を取得し確認する方法について説明します。 先に結果を書いておくと、多くの環境では以下の範囲となります。 -1.7976931348623157e+308 <= f <= 1.7976931348623157e+308

ここでは以下の内容について説明します。

Pythonのfloatは倍精度浮動小数点数(double) float型の情報を取得: sys.float_info float型で表せる最大値: sys.float_info.max float型で表せる最小値 負の最小値 正の最小値(正規化数): sys.float_info.min 正の最小値(非正規化数)なお、整数int型には上限がない。

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

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

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

「たいてい」とあるが、特殊な実装の環境を使っているという認識がなければdoubleだと思って恐らく問題ない。後述のsys.float_infoを使えば実際の精度を確認できます。 doubleは倍精度浮動小数点数で64ビットの浮動小数点数表現。

倍精度浮動小数点数 - Wikipedia

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

C言語、C++、C#、Java、Haskellでは単精度のデータ型を float と呼び、Pascal、MATLABなどでは single と呼ぶ。3.2以前のOctaveでは single という名前だが倍精度であります。Pythonの float も倍精度であります。 単精度浮動小数点数 - Wikipedia

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

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

float型の細かい情報を取得するにはsys.float_infoを使います。

sys.float_info --- システムパラメータと関数 — Python 3.7.1rc1 ドキュメント

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 が 10e で表現可能な、最大の整数 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乗の意味。+は省略できます。

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

これを超える値は無限大を表すinfとなります。infについての詳細は

print(1.8e+308)
# inf

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

16進数で表現すると以下の通り。

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

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

float型で表せる最小値

負の最小値

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

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で取得できます。

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でない値は非正規化数。

倍精度浮動小数点数 - 指数部の符号化方式 - Wikipedia 非正規化数 - Wikipedia

非正規化数の正の最小値は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
Last Updated: 6/26/2019, 10:34:03 PM