2009-03-06 2 views

답변

8

확인하십시오 http://linux.die.net/man/1/gcc 이 문제를 처리하려면 -mcheck-zero-division 컴파일러 옵션이 있습니다.

또는, SIGFPE 처리기를 설치하는 옵션이 될 수도 는 0에 의한 플로트 사업부는

대부분의 부동 소수점 시스템은 IEEE 표준을 기반으로

  signal(SIGFPE, (fptr) FPE_ExceptionHandler); 

     void FPE_ExceptionHandler(int nSig,int nErrType,int */*pnReglist*/) 
      { 
       switch(nErrType) 
        { 
        case FPE_ZERODIVIDE: /* ??? */ break; 
       } 

      } 

이후 'FPE_ZERODIVIDE'를 생성하는 것 이것은 0으로 나눌 수 있습니다. 숫자의 부호에 따라 양의 무한대 또는 음의 무한대를 적절하게 반환합니다. (0/0가 NAN을 반환하는 것을 제외하고 - 예외적 인 경우는 아닙니다.) 이것은 과학적 및 수학적 응용에 유용합니다. NAN은 효과적으로 계산이 불가능하지만 계산을 계속할 수있는 경우를 알립니다. 계산을 계속할 경우 새로운 결과는 나오지 않지만 NAN을 계속 반환 할 것입니다. 이렇게하면 계산 내에서 오류 검사없이 길게 긴 계산 체인을 수행 할 수 있습니다. 오류 검사는 작업의 마지막 단계에서만 수행하면됩니다. 이렇게하면 코드가 훨씬 간단하고 빠릅니다. 또한 일부 응용 프로그램의 경우와 같이 때때로 유용 할 수도 있습니다. infintity는 실제로 "유용한"결과이며 실제로 문제의 징후는 아닙니다.

+1

-mcheck-zero-division 옵션은 MIPS 아키텍처에만 적용됩니다. 예 : x86에서는 작동하지 않습니다. – janneb

+0

네, 맞습니다. 우리는 SIGFPE 핸들러에 갈 필요가 있습니다. – lakshmanaraj

3

아니요 - 예외가 발생하지 않습니다 (신호를 받음 - 아마 SIGFPE).

3

이 경우 런타임 오류가 발생합니다 (lakshmanaraj's nice discussion on IEEE maths 참조). 일부 컴파일러는 NaN 대신 오류를 강제 적용 할 수 있지만, 코드에서 0으로 나누기가 가능한지 확인해야합니다. , 부동 소수점 예외 신호을 던집니다.

신호는 C++ 예외와 다른 메커니즘이며 OS 수준에서 처리됩니다. 를 포함한 * 괜찬아 신호 메커니즘을 관련된 SO 질문의 수를 이미 있습니다 Windows 용

, 당신은 다른 사람에게 물어해야합니다. Mac OS X은 물론 유닉스 계열 시스템입니다.

+0

Windows에는 구조화 된 예외 처리라고하는 자체 메커니즘이 있습니다. SEH로 약칭 된 것을 볼 수 있습니다 : http://msdn.microsoft.com/en-us/library /ms680657(VS.85).aspx –

관련 문제