Namespaces
Variants

feupdateenv

From cppreference.net
< c ‎ | numeric ‎ | fenv
ヘッダーで定義 <fenv.h>
int feupdateenv ( const fenv_t * envp ) ;
(C99以降)

まず、現在発生している浮動小数点例外を記憶し、次に envp が指すオブジェクトから浮動小数点環境を復元し( fesetenv と同様)、その後、保存されていた浮動小数点例外を発生させます。

この関数は、以前の feholdexcept の呼び出しによって確立されたノンストップモードを終了するために使用できます。

目次

パラメータ

envp - fenv_t のオブジェクトへのポインタ。 以前の feholdexcept または fegetenv の呼び出しによって設定されるか、 FE_DFL_ENV と等しい。

戻り値

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)   /* 2倍 */
{
    fenv_t curr_excepts;
    /* 現在の浮動小数点環境を保存してクリア */
    feholdexcept(&curr_excepts);
    /* 不正確例外とオーバーフロー例外を発生 */
    printf("In x2():  x = %f\n", x=x*2.0);
    show_fe_exceptions();
    feclearexcept(FE_INEXACT);   /* 呼び出し元から不正確例外を隠す */
    /* 呼び出し元の例外(FE_INVALID)を */
    /* x2の残りの例外(FE_OVERFLOW)とマージ */
    feupdateenv(&curr_excepts);
    return x;
}
int main(void)
{    
    feclearexcept(FE_ALL_EXCEPT);
    feraiseexcept(FE_INVALID);   /* 無効な引数での計算 */
    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.4 feupdateenv関数 (p: 214-215)
  • C99規格 (ISO/IEC 9899:1999):
  • 7.6.4.4 feupdateenv関数 (p: 195-196)

関連項目

環境を保存し、全てのステータスフラグをクリアして以降の全てのエラーを無視する
(関数)
現在の浮動小数点環境を保存または復元する
(関数)
デフォルト浮動小数点環境
(マクロ定数)
C++ドキュメント for feupdateenv