3.7 無窮大與NaN

2018-02-24 15:26 更新

問題

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

解決方案

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

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

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

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

討論

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

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

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

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

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

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

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

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

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

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

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

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)