前些日子在使用Kinsol庫(求解非線性方程的數(shù)值庫)時,出現(xiàn)死循環(huán)。調(diào)試跟蹤,發(fā)現(xiàn)浮點型數(shù)據(jù)異常,異常的數(shù)據(jù)使得大小比較失效,無法退出循環(huán)。這個問題涉及到浮點型數(shù)據(jù)的具體構(gòu)造,詳細介紹可參考下文:http://steve.hollasch.net/cgindex/coding/ieeefloat.html
本文討論怎樣的運算造成異常的浮點型數(shù)據(jù),即異常數(shù)據(jù)的來源。浮點型數(shù)據(jù)分成三類,finite型,inf型,nan型。finite型好理解,是指有限數(shù)如0,1.1等。inf型是表示無窮大數(shù),分為正無窮和負無窮,它由非0的有限數(shù)除0得到或者超過了浮點型能夠表示的最大最小數(shù)。浮點型不像整型那樣除零報錯。nan型即not a number, 表示這不是一個數(shù)。它是由一些無意義的運算引起的,比如0/0,inf-inf,inf*0等,這些運算不能確定結(jié)果是什么。
前兩種類型是可以比較大小,比如:1<inf,inf > 3,inf > -inf,inf == inf。這些比較是有意義的。但不能和nan型比較,如果比較則總返回0(返回什么值,大家最好自己做測試),我遇到的問題就是在比較表達式中出現(xiàn)了nan型數(shù)。
要判斷一個浮點數(shù)是否是inf或者nan,有函數(shù)int _isnan(double x)和int _finite(double x),在float.h中聲明。