3.7 æ— ç©·å¤§ä¸ŽNaN¶
问题¶
ä½ æƒ³åˆ›å»ºæˆ–æµ‹è¯•æ£æ— ç©·ã€�è´Ÿæ— ç©·æˆ–NaN(é�žæ•°å—)的浮点数。
解决方案¶
Pythonå¹¶æ²¡æœ‰ç‰¹æ®Šçš„è¯æ³•æ�¥è¡¨ç¤ºè¿™äº›ç‰¹æ®Šçš„æµ®ç‚¹å€¼ï¼Œä½†æ˜¯å�¯ä»¥ä½¿ç”¨ float() æ�¥åˆ›å»ºå®ƒä»¬ã€‚比如:
>>> a = float('inf')
>>> b = float('-inf')
>>> c = float('nan')
>>> a
inf
>>> b
-inf
>>> c
nan
>>>
为了测试这些值的å˜åœ¨ï¼Œä½¿ç”¨ math.isinf() å’Œ math.isnan() 函数。比如:
>>> math.isinf(a)
True
>>> math.isnan(c)
True
>>>
讨论¶
想了解更多这些特殊浮点值的信æ�¯ï¼Œå�¯ä»¥å�‚考IEEE 754规范。 然而,也有一些地方需è¦�ä½ ç‰¹åˆ«æ³¨æ„�,特别是跟比较和æ“�作符相关的时候。
æ— ç©·å¤§æ•°åœ¨æ‰§è¡Œæ•°å¦è®¡ç®—çš„æ—¶å€™ä¼šä¼ æ’,比如:
>>> a = float('inf')
>>> a + 45
inf
>>> a * 10
inf
>>> 10 / a
0.0
>>>
但是有些�作时未定义的并会返回一个NaN结果。比如:
>>> a = float('inf')
>>> a/a
nan
>>> b = float('-inf')
>>> a + b
nan
>>>
NaN值会在所有æ“�作ä¸ä¼ æ’,而ä¸�会产生异常。比如:
>>> 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é»˜è®¤è¡Œä¸ºï¼Œåœ¨è¿”å›žæ— ç©·å¤§æˆ–NaN结果的æ“�ä½œä¸æŠ›å‡ºå¼‚å¸¸ã€‚
fpectl 模å�—å�¯ä»¥ç”¨æ�¥æ”¹å�˜è¿™ç§�è¡Œä¸ºï¼Œä½†æ˜¯å®ƒåœ¨æ ‡å‡†çš„Python构建ä¸å¹¶æ²¡æœ‰è¢«å�¯ç”¨ï¼Œå®ƒæ˜¯å¹³å�°ç›¸å…³çš„,
并且针对的是专家级程�员。�以�考在线的Python文档获�更多的细节。