3.7 無窮大與NaN

2018-02-24 15:26 更新

問題

你想創(chuàng)建或測試正無窮、負(fù)無窮或NaN(非數(shù)字)的浮點數(shù)。

解決方案

Python并沒有特殊的語法來表示這些特殊的浮點值,但是可以使用 float() 來創(chuàng)建它們。比如:

>>> a = float('inf')
>>> b = float('-inf')
>>> c = float('nan')
>>> a
inf
>>> b
-inf
>>> c
nan
>>>

為了測試這些值的存在,使用 math.isinf()math.isnan() 函數(shù)。比如:

>>> math.isinf(a)
True
>>> math.isnan(c)
True
>>>

討論

想了解更多這些特殊浮點值的信息,可以參考IEEE 754規(guī)范。然而,也有一些地方需要你特別注意,特別是跟比較和操作符相關(guān)的時候。

無窮大數(shù)在執(zhí)行數(shù)學(xué)計算的時候會傳播,比如:

>>> a = float('inf')
>>> a + 45
inf
>>> a * 10
inf
>>> 10 / a
0.0
>>>

但是有些操作時未定義的并會返回一個NaN結(jié)果。比如:

>>> a = float('inf')
>>> a/a
nan
>>> b = float('-inf')
>>> a + b
nan
>>>

NaN值會在所有操作中傳播,而不會產(chǎn)生異常。比如:

>>> c = float('nan')
>>> c + 23
nan
>>> c / 2
nan
>>> c * 2
nan
>>> math.sqrt(c)
nan
>>>

NaN值的一個特別的地方時它們之間的比較操作總是返回False。比如:

>>> c = float('nan')
>>> d = float('nan')
>>> c == d
False
>>> c is d
False
>>>

由于這個原因,測試一個NaN值得唯一安全的方法就是使用 math.isnan() ,也就是上面演示的那樣。

有時候程序員想改變Python默認(rèn)行為,在返回?zé)o窮大或NaN結(jié)果的操作中拋出異常。fpectl模塊可以用來改變這種行為,但是它在標(biāo)準(zhǔn)的Python構(gòu)建中并沒有被啟用,它是平臺相關(guān)的,并且針對的是專家級程序員??梢詤⒖荚诰€的Python文檔獲取更多的細(xì)節(jié)。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號