名前空間
変種
操作

expm1, expm1f, expm1l

提供: cppreference.com
< c‎ | numeric‎ | math
 
 
 
一般的な数学関数
関数
基本操作
(C99)
(C99)
(C99)
(C99)
(C99)
(C99)(C99)(C99)
指数関数
(C99)
expm1
(C99)
(C99)
(C99)
冪関数
(C99)
(C99)
三角関数と双曲線関数
(C99)
(C99)
(C99)
誤差関数とガンマ関数
(C99)
(C99)
(C99)
(C99)
最も近い整数
(C99)(C99)(C99)
(C99)
(C99)(C99)(C99)
浮動小数点操作関数
(C99)(C99)
(C99)
(C99)
分類
(C99)
(C99)
(C99)
(C99)(C99)
マクロ定数
 
ヘッダ <math.h> で定義
float       expm1f( float arg );
(1) (C99以上)
double      expm1( double arg );
(2) (C99以上)
long double expm1l( long double arg );
(3) (C99以上)
ヘッダ <tgmath.h> で定義
#define expm1( arg )
(4) (C99以上)
1-3) e (ネイピア数 2.7182818) の arg 乗マイナス 1.0 を計算します。 arg がゼロに近い場合、この関数は式 exp(arg)-1.0 よりも正確です。
4) 型総称マクロ。 arglong double 型の場合は expm1l が呼ばれます。 そうでなく、 arg が整数型または double 型の場合は expm1 が呼ばれます。 そうでなければ expm1f が呼ばれます。

目次

[編集] 引数

arg - 浮動小数点値

[編集] 戻り値

エラーが発生しなければ、 earg
-1
が返されます。

オーバーフローによる値域エラーが発生した場合、 +HUGE_VAL+HUGE_VALF または +HUGE_VALL が返されます。

アンダーフローによる値域エラーが発生した場合、 (丸めた後の) 正しい結果が返されます。

[編集] エラー処理

math_errhandling で規定されている通りにエラーが報告されます。

処理系が IEEE 浮動小数点算術 (IEC 60559) をサポートしている場合、

  • 引数が ±0 であれば、それが変更されずに返されます。
  • 引数が -∞ であれば、 -1 が返されます。
  • 引数が +∞ であれば、 +∞ が返されます。
  • 引数が NaN であれば、 NaN が返されます。

[編集] ノート

関数 expm1 および log1p は財務計算に便利です。 例えば、小さな日々の金利を計算するとき、 (1+x)n
-1
expm1(n * log1p(x)) として表現できます。 またこれらの関数は正確な逆双曲線関数を書くことを単純化します。

IEEE 互換の double 型の対して、 709.8 < arg であればオーバーフローが保証されます。

[編集]

#include <stdio.h>
#include <math.h>
#include <float.h>
#include <errno.h>
#include <fenv.h>
#pragma STDC FENV_ACCESS ON
int main(void)
{
    printf("expm1(1) = %f\n", expm1(1));
    printf("Interest earned in 2 days on $100, compounded daily at 1%%\n"
           " on a 30/360 calendar = %f\n",
           100*expm1(2*log1p(0.01/360)));
    printf("exp(1e-16)-1 = %g, but expm1(1e-16) = %g\n",
           exp(1e-16)-1, expm1(1e-16));
    // special values
    printf("expm1(-0) = %f\n", expm1(-0.0));
    printf("expm1(-Inf) = %f\n", expm1(-INFINITY));
    //error handling
    errno = 0; feclearexcept(FE_ALL_EXCEPT);
    printf("expm1(710) = %f\n", expm1(710));
    if(errno == ERANGE) perror("    errno == ERANGE");
    if(fetestexcept(FE_OVERFLOW)) puts("    FE_OVERFLOW raised");
}

出力例:

expm1(1) = 1.718282
Interest earned in 2 days on $100, compounded daily at 1%
 on a 30/360 calendar = 0.005556
exp(1e-16)-1 = 0, but expm1(1e-16) = 1e-16
expm1(-0) = -0.000000
expm1(-Inf) = -1.000000
expm1(710) = inf
    errno == ERANGE: Result too large
    FE_OVERFLOW raised

[編集] 参考文献

  • C11 standard (ISO/IEC 9899:2011):
  • 7.12.6.3 The expm1 functions (p: 243)
  • 7.25 Type-generic math <tgmath.h> (p: 373-375)
  • F.10.3.3 The expm1 functions (p: 521)
  • C99 standard (ISO/IEC 9899:1999):
  • 7.12.6.3 The expm1 functions (p: 223-224)
  • 7.22 Type-generic math <tgmath.h> (p: 335-337)
  • F.9.3.3 The expm1 functions (p: 458)

[編集] 関連項目o

(C99)(C99)
ex 乗 (ex) を計算します
(関数) [edit]
(C99)(C99)(C99)
2x 乗 (2x) を計算します
(関数) [edit]
(C99)(C99)(C99)
指定した値に1を加えた値の自然対数 (ln(1+x)) を計算します
(関数) [edit]