Pythonの最小値と最大値は何ですか?
これを見てください post 。
投稿の関連部分:
[2]で:種類のインポート [3]で:kind.default_float_kind.M kinds.default_float_kind.MAX kind.default_float_kind.MIN kinds.default_float_kind 。 308
>>> 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
として取得できます。このような数値は、精度が失われて表示されることに注意してください。予想どおり、非正規化された最小値は正規化された最小値よりも小さくなっています。
以前の回答に対する一種の理論的な補足として、「マジック」値±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
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
を返します。
遊んでみます。以下は、最小および最大の正の浮動小数点数を見つけるアルゴリズムの方法です。うまくいけば、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)
したがって、デノーマルが使用されます。
技術的には、最小のフロートは-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
*
が付いた数値は、マシンに依存し、実装に依存します。