web-dev-qa-db-ja.com

Pythonで浮動小数点が持つことができる値の範囲は何ですか?

Pythonの最小値と最大値は何ですか?

36

これを見てください post

投稿の関連部分:

 [2]で:種類のインポート
 [3]で:kind.default_float_kind.M 
 kinds.default_float_kind.MAX kind.default_float_kind.MIN 
 kinds.default_float_kind 。 308 
15
Juha Syrjälä
>>> import sys
>>> sys.float_info
sys.floatinfo(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.2204460492503131e-16, radix=2, rounds=1)

最小はsys.float_info.min(2.2250738585072014e-308)、最大はsys.float_info.max(1.7976931348623157e + 308)です。他のプロパティについては documentation をご覧ください。

sys.float_info.minは正規化された分です。通常、非正規化された分はsys.float_info.min * sys.float_info.epsilonとして取得できます。このような数値は、精度が失われて表示されることに注意してください。予想どおり、非正規化された最小値は正規化された最小値よりも小さくなっています。

73
Denis Otkidach

以前の回答に対する一種の理論的な補足として、「マジック」値±308は、浮動小数点のバイナリ表現から直接得られることを述べておきます。 倍精度浮動小数点数 は、「小」小数値c(〜1)を含む±c * 2 ** qの形式であり、qは、11桁の2進数で書かれた整数(符号用の1ビットを含む) )。 2 **(2 ** 10-1)に308(10進数)桁があるという事実は、極端な浮動小数点値での10 **±308の出現を説明します。

Pythonでの計算:

>>> print len(repr(2**(2**10-1)).rstrip('L'))
308
8
Eric O Lebigot

Pythonは倍精度の浮動小数点数を使用し、約10から-308まで、10から308乗までの値を保持できます。

http://en.wikipedia.org/wiki/Double_precision_floating-point_format

Pythonプロンプトからこの実験を試してください:

>>> 1e308
1e+308
>>> 1e309
inf

10から309はオーバーフローですが、10から38はオーバーフローではありません。 QED。

実際には、おそらく denormals を介して1e-308より小さい数値を取得できますが、これには大きなパフォーマンスヒットがあります。 Pythonは1e-324を処理できますが、1e-325でアンダーフローし、値として0.0を返します。

4
steveha

遊んでみます。以下は、最小および最大の正の浮動小数点数を見つけるアルゴリズムの方法です。うまくいけば、float("+inf")が受け入れられるすべてのpython実装で:

def find_float_limits():
    """Return a Tuple of min, max positive numbers
    representable by the platform's float"""

    # first, make sure a float's a float
    if 1.0/10*10 == 10.0:
        raise RuntimeError("Your platform's floats aren't")

    minimum= maximum= 1.0
    infinity= float("+inf")

    # first find minimum
    last_minimum= 2*minimum
    while last_minimum > minimum > 0:
        last_minimum= minimum
        minimum*= 0.5

    # now find maximum
    operands= []
    while maximum < infinity:
        operands.append(maximum)
        try:
            maximum*= 2
        except OverflowError:
            break
    last_maximum= maximum= 0
    while operands and maximum < infinity:
        last_maximum= maximum
        maximum+= operands.pop()

    return last_minimum, last_maximum

if __name__ == "__main__":
    print (find_float_limits()) # python 2 and 3 friendly

私の場合、

$ python so1835787.py
(4.9406564584124654e-324, 1.7976931348623157e+308)

したがって、デノーマルが使用されます。

3
tzot

技術的には、最小のフロートは-infで、最大のフロートはinfです。

>>> (float('-inf')            #   negative infinity 
< -1.7976931348623157e+308    #*  smallest float that is not negative infinity 
< -4.9406564584124654e-324    #*  biggest negative float that is not zero
< 0                           #   zero duh
< 4.9406564584124654e-324     #*  smallest positive float that is not zero
< 1.7976931348623157e+308     #*  biggest float that is not positive infinity
< float('inf'))               #   positive infinity
True

*が付いた数値は、マシンに依存し、実装に依存します。

3
Benoît Pilatte