float可以在Python中使用的值范围是多少?

时间:2009-12-02 21:02:28

标签: python floating-point

python中最小和最大的值是什么?

6 个答案:

答案 0 :(得分:64)

>>> 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。请注意,这些数字表示精度不足。正如所料,非正规化min小于标准化min。

答案 1 :(得分:13)

请参阅此post

帖子的相关部分:

In [2]: import kinds 
In [3]: kinds.default_float_kind.M 
kinds.default_float_kind.MAX         kinds.default_float_kind.MIN 
kinds.default_float_kind.MAX_10_EXP  kinds.default_float_kind.MIN_10_EXP 
kinds.default_float_kind.MAX_EXP     kinds.default_float_kind.MIN_EXP 
In [3]: kinds.default_float_kind.MIN 
Out[3]: 2.2250738585072014e-308 

答案 2 :(得分:8)

作为对前面答案的一种理论补充,我想提一下,“魔术”值±308直接来自浮点数的二进制表示。 Double precision floats具有±c * 2 ** q的形式,具有“小”小数值c(~1),并且q是用11个二进制数字写入的整数(其符号包括1位)。 2 **(2 ** 10-1)具有308(十进制)数字的事实解释了极值浮点值中10 **±308的出现。

用Python计算:

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

答案 3 :(得分:4)

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 :(得分:3)

只是玩耍;这是一个算法方法,可以找到最小和最大正浮点数,希望在任何可以接受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)

使用非正规。

答案 5 :(得分:1)

从技术上讲,最小浮点为-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
带有*

数字与机器有关,与实现有关。