2

전에 여러 번 질문 한 것에 대해 사과드립니다. 그러나 여러 번 검색 한 결과 C/C++에서 FPE를 처리하는 방법과 Fortran에서 FPE를 처리하는 방법 사이에 근본적인 오해가있을 수 있음을 알고 있습니다.혼합 C/포트란 코드에서 부동 소수점 예외 트래핑

부동 소수점 예외 (예 : NAN 사용)를 트랩하려면 Fortran (정확하게는 GNU Fortran)에서 컴파일러 플래그 -ffpe-trap = invalid가 트릭을 수행합니다. 문제가 발생한 명령문이 실행되면 바로 부동 소수점 예외가 발생합니다.

그러나 C (GNU gcc)에서는 그렇지 않습니다. 더 성가신 (그러나 놀랄 일도 아닌) 것은 Fortran 프로그램에서 호출 할 때와 달리 C 메인에서 호출 할 때 예외를 발생시키고 실행을 중단하지 않는 동일한 포트란 코드입니다. 그리고 이것은 C 또는 gfortran 링커가 사용되는지 여부에 독립적입니다.

많이 검색하고 읽은 후 fenv.h에서 사용할 수있는 C/C++ 기능이 있으며 예외 처리의 "C 방식"을 제시합니다. 나는 예외 플래그를 설정할 수 있고 나중에 예외가 발생했는지 확인합니다. 이 접근 방식이 예외 처리 방법에 대해 한층 더 유연성을 줄 수있는 방법을 알 수 있습니다. 이것은 C에서 예외를 처리하는 "모범 사례"방법입니까? 과학 프로그래밍 (C가 Fortran 코드를 호출하는 데 자주 사용되는 경우)에서 예외가 발생하는 위치에 대한 고급 지식이 있어야하는 것은 불편한 것 같습니다.

C에서 예외의 첫 번째 모양이 멈추는 코드가 없습니까 (직접적인) 방법이 있습니까? 아니면 완전히 이해하지 못하고있는 C의 예외 처리에 관해서 또 다른 패러다임이 있습니까?

+0

내가 뭔가'feenableexcept()를 밝혀 OS X의 – Donna

+0

를 실행하고'비 표준입니다. [이 질문에 대한 답변] (http://stackoverflow.com/questions/247053/enabling-floating-point-interrupts-on-mac-os-x-intel)에는 몇 가지 제안 사항이 있으며 [이 블로그 게시물] (http : //philbull.wordpress.com/2012/12/09/update-floating-point-exception-handling-on-mac-os-x/)는 Linux 및 Mac OS X에서 모두 작동하는 일부 코드를 가리 킵니다. –

+0

예, 이 게시물을 발견하고 참조 된 코드가 정확히 내가 원하는 것을 수행하는 것 같습니다.설명 된 확장이 합리적인 방법인지 여부에 대한 감각을 갖고 있습니까? – Donna

답변

0

을 나는 방법을 보여줍니다 위의 질문을 통해 내가하고자하는 일을 정확하게 수행하십시오. 그것은 here을 언급 한 Mac OSX 확장과 시그널링 값은 here이라고 설명합니다.

나는이 주제 중 하나의 전문가가 아니므로이 코드의 이식성에 대한 어떠한 주장도 제기 할 수 없습니다. 하지만 그것은 내가 원했던 두 가지 일을합니다 : 그것은 "NAN"으로 데이터를 초기화 할 수있게하고, 나중에 이러한 초기화되지 않은 값의 잘못된 사용을 잡아냅니다. 트랩은 정상 실행과 gdb에서 모두 감지됩니다.

이 솔루션에 대한 의견을 보내 주시면 감사하겠습니다.


#include "fp_exception_glibc_extension.h" 
#include <fenv.h> 
#include <signal.h> 
#include <stdio.h> 

/* 
----------------------------------------------------------------------- 
This example illustrates how to initialize data with an sNAN. Later, if 
the data is used in its 'uninitialized' state, an exception is raised, 
and execution halts. 

The floating point exception handler 'fp_exception_glibc_extension' is 
needed for OS X portability. 

At least two blog posts were used in writing this : 

"Update: Floating-point exception handling on Mac OS X" 
http://philbull.wordpress.com/2012/12/09/update-floating-point-exception-handling-on-mac-os-x/ 
Note : there is a lengthy email exchange about how portable this extension is; see 
comments in the text of the code. 

"NaNs, Uninitialized Variables, and C++" 
http://codingcastles.blogspot.fr/2008/12/nans-in-c.html 
----------------------------------------------------------------------- 
*/ 

void set_snan(double& f) 
{ 
    *((long long*)&f) = 0x7ff0000000000001LL; 
} 

int main() 
{ 
    /* On OS X, this extension is provided by 
     'fp_exception_glibc_extension.{c,h} */ 
    feenableexcept(FE_INVALID); 

    double p; 
    set_snan(p); /* Initialize to signaling nan */ 

    double q; 
    q = 2*p;  /* Floating point exception is trapped here */ 
    printf("p = %f; q = %f\n",p,q); 
} 
+1

여기에 'set_snan'의 사용이 필요합니다. . math.h에 제공된 NAN 매크로의 값을 초기화하는 것은 나중에 프로그램에서 사용할 때 트랩되지 않습니다. – Donna

1

GNU 유틸리티를 사용하기 때문에 * nix에 있다고 가정합니다. 부동 소수점 예외를 활성화해야합니다. 이 작업이 완료되면 예외가 신호를 사용하여 전달됩니다. libm의와

#include <fenv.h> 
#include <signal.h> 
#include <stdio.h> 
#include <stdlib.h> 

void handler(int sig) { 
    printf("Floating Point Exception\n"); 
    exit(0); 
} 


int main(int argc, char ** argv) { 
    feenableexcept(FE_INVALID | FE_DIVBYZERO | FE_OVERFLOW | FE_UNDERFLOW); 
    signal(SIGFPE, handler); 

    float a = 42.0, b = 0.0, res; 

    res = a/b; 

    return 0; 
} 

링크 :

gcc -o test test.c -lm 

Windows에서 당신이 구조화 된 예외 처리기를 사용할 필요가 믿는 : 다음 코드는 보여 다음 코드에서 http://msdn.microsoft.com/en-us/library/windows/desktop/ms680657(v=vs.85).aspx

+0

나는 feenableexcept를 사용할 수없는 OS X를 사용 중이다. 그러나 나는이 확장을 우연히 만났는데, 이것은 내가 원했던 것과 똑같이하는 것으로 밝혀졌다. [OSX_fpe_fix] (http://philbull.wordpress.com/2012/12/09/update-floating-point-exception-handling-on-mac-os-x/) – Donna