2009-12-02 70 views

回答

11

看到這個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 
+0

請注意,數字已經在很大程度上被NumPy所取代。我想知道是否有更現代的種類模塊存在,儘管... – EOL 2009-12-02 21:32:18

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作爲值。

+1

而且1e + 308應該如何比無限大(見問題)? ;) – sfussenegger 2009-12-03 11:22:25

+0

@sfussenegger:答案「-inf和+ inf」當然是對這個問題的有效回答。請將它作爲單獨的答案發布。 – 2017-04-15 10:28:01

7

作爲對以前答案的一種理論補充,我想提一下,「魔術」值±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

只是玩弄;這裏是找到的最小和最大正浮點數的計算方法,希望能在任何Python實現,其中float("+inf")是可以接受的:

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) 

所以使用非正規數。

57
>>> 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.epsilon。但請注意,這些數字是以精確度損失表示的。