Namespaces
Variants

feholdexcept

From cppreference.net
< c ‎ | numeric ‎ | fenv
헤더 파일에 정의됨 <fenv.h>
int feholdexcept ( fenv_t * envp ) ;
(C99부터)

먼저, 현재 부동 소수점 환경을 envp 가 가리키는 객체에 저장합니다 ( fegetenv 와 유사). 그런 다음 모든 부동 소수점 상태 플래그를 지우고, 비트랩 모드를 설정합니다: 이후 부동 소수점 예외는 실행을 중단하지 않으며(트랩되지 않음), feupdateenv 또는 fesetenv 에 의해 부동 소수점 환경이 복원될 때까지 이 상태가 유지됩니다.

이 함수는 호출자에게 발생시킬 수 있는 부동 소수점 예외를 숨겨야 하는 서브루틴의 시작 부분에서 사용될 수 있습니다. 일부 예외만 억제하고 다른 예외는 보고해야 하는 경우, 원치 않는 예외를 클리어한 후 feupdateenv 호출로 논스톱 모드를 종료하는 것이 일반적입니다.

목차

매개변수

envp - fenv_t 타입의 객체를 가리키는 포인터로, 부동 소수점 환경이 저장될 위치

반환값

0 성공 시 0, 그렇지 않으면 0이 아닌 값.

예제

#include <stdio.h>
#include <fenv.h>
#include <float.h>
#pragma STDC FENV_ACCESS ON
void show_fe_exceptions(void)
{
    printf("current exceptions raised: ");
    if(fetestexcept(FE_DIVBYZERO))     printf(" FE_DIVBYZERO");
    if(fetestexcept(FE_INEXACT))       printf(" FE_INEXACT");
    if(fetestexcept(FE_INVALID))       printf(" FE_INVALID");
    if(fetestexcept(FE_OVERFLOW))      printf(" FE_OVERFLOW");
    if(fetestexcept(FE_UNDERFLOW))     printf(" FE_UNDERFLOW");
    if(fetestexcept(FE_ALL_EXCEPT)==0) printf(" none");
    printf("\n");
}
double x2 (double x)   /* times two */
{
    fenv_t curr_excepts;
    /* Save and clear current f-p environment. */
    feholdexcept(&curr_excepts);
    /* Raise inexact and overflow exceptions. */
    printf("In x2():  x = %f\n", x=x*2.0);
    show_fe_exceptions();
    feclearexcept(FE_INEXACT);   /* hide inexact exception from caller */
    /* Merge caller's exceptions (FE_INVALID)        */
    /* with remaining x2's exceptions (FE_OVERFLOW). */
    feupdateenv(&curr_excepts);
    return x;
}
int main(void)
{    
    feclearexcept(FE_ALL_EXCEPT);
    feraiseexcept(FE_INVALID);   /* some computation with invalid argument */
    show_fe_exceptions();
    printf("x2(DBL_MAX) = %f\n", x2(DBL_MAX));
    show_fe_exceptions();
    return 0;
}

출력:

current exceptions raised:  FE_INVALID
In x2():  x = inf
current exceptions raised:  FE_INEXACT FE_OVERFLOW
x2(DBL_MAX) = inf
current exceptions raised:  FE_INVALID FE_OVERFLOW

참고문헌

  • C11 표준 (ISO/IEC 9899:2011):
  • 7.6.4.2 feholdexcept 함수 (p: 213-214)
  • C99 표준 (ISO/IEC 9899:1999):
  • 7.6.4.2 feholdexcept 함수 (p: 194-195)

참조 항목

부동 소수점 환경을 복원하고 이전에 발생한 예외를 발생시킴
(함수)
현재 부동 소수점 환경을 저장하거나 복원함
(함수)
기본 부동 소수점 환경
(매크로 상수)
C++ 문서 for feholdexcept