2011-10-05 4 views
1

나는 gges을 호출 중이며 고유 값을 얻고 싶습니다. 응용 노트에서 나는이 disclaimer를 읽었습니다 : alphar (j)/beta (j)와 alphai (j)/beta (j)는 쉽게 오버 또는 언더 플로우 될 수 있고 beta (j)는 심지어 0 일 수도 있습니다 . 따라서 단순히 비율을 계산하는 것을 피해야합니다. 그러나, alphar와 alphai는 언제나 norm (A)의 크기보다 작고 보통 beta와 같고 beta는 항상 norm보다 작고 보통 (B)와 비교됩니다.오버 플로우 또는 언더 플로우 방지

내가 과다 또는 언더 플로우 방지하고 오류와 함께 프로그램을 중지하려면 : 결과가 큰 다음 큰 것을,

답변

1

가 오버 플로우가 의미 사전에

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

감사합니다, 따라서 sometest이 될 수있다 : 결과가 작은보다 작은 것 언더 플로우를 들어

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

에게, 따라서 sometest가 될 수있다 :

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

거대하고 작은 것은 내장 함수입니다.

편집 : 실제로 두 번째 생각에 오버플로 테스트는 너무 좋지 않을 수 있습니다. 곱셈 자체가 오버플로가되기 때문에 abs (beta (i))가 1보다 큰 경우 오버플로 테스트가 좋을 수 있습니다. 따라서 이것을 캡처해야합니다. 베타가 1보다 작은 경우에만 오버플로 테스트를 수행하고 1보다 작은 경우 언더 플로 테스트를 수행 할 수 있습니다.

+0

감사합니다! 매우 도움이된다! – BCartolo

+0

+1 좋은 방법입니다. 또는 코드를 변경하지 않으려는 경우 부동 소수점 예외를 포착하는 플래그를 사용하여 컴파일 할 수 있습니다. ifort는 -fpe이거나 다른 컴파일러의 man 페이지를 읽는다. – milancurcic

+0

새 코드이므로 코드 수정에 신경 쓰지 않아도됩니다. – BCartolo