2011-10-05 106 views
1

我打電話給gges,我想獲得特徵值。在應用筆記中,我讀了這個免責聲明:防止過量或下溢

商alphar(j)/ beta(j)和alphai(j)/ beta(j)可能很容易上溢或下溢,beta(j)甚至可能爲零。因此,你應該避免簡單地計算比率。然而,alphar和alphai總是小於並且通常與規範(A)相當,並且beta總是小於並且通常與規範(B)相當。

我想,以防止過度或下溢,並以一個錯誤終止程序:提前

do i=1,N 
    if (sometest(alphar(i), beta(i)) then 
     stop 'Eigenvalues over- or underflow!' 
    endif 
    Lambda(i) = alphar(i)/beta(i) 
enddo 

感謝

回答

1

溢出將意味着,該結果是較大的那麼巨大,因此sometest可能是:

abs(alphar(i)) > abs(beta(i))*huge(alphar(i)) 

對於下溢的結果會比小的小,從而sometest可能是:

abs(alphar(i)) < abs(beta(i))*tiny(alphar(i)) 

巨大而微小的內在功能。

編輯:實際上,第二個想法是溢出測試可能不太好,因爲如果abs(beta(i))大於1,乘法本身會導致溢出。因此,您需要捕獲此信息。如果beta小於1,則只能進行溢出測試,並且只有在小於1時纔會進行下溢測試。

+0

謝謝!很有幫助! – BCartolo

+0

+1這是一個很好的方法。或者,如果您不想更改代碼,則可以使用可捕獲浮點異常的標誌進行編譯,例如如果它是-fpe [0123],或者爲其他編譯器讀取手冊頁。 – milancurcic

+0

新代碼,所以我不在乎修改代碼。 – BCartolo