[C言語 標準ライブラリ] math.hの使い方

※本ブログでは、商品・サービスのリンク先にプロモーションを含みます。

スポンサーリンク

math.hには、数学的な演算を行う関数、およびマクロが宣言、定義されています。

  1. マクロ定数
    1. HUGE_VAL
    2. HUGE_VALF
    3. HUGE_VALL
    4. INFINITY
    5. NAN
    6. FP_INFINITE
    7. FP_NAN
    8. FP_NORMAL
    9. FP_SUBNORMAL
    10. FP_ZERO
    11. FP_FAST_FMA
    12. FP_FAST_FMAF
    13. FP_FAST_FMAL
    14. FP_ILOGB0
    15. FP_ILOGBNAN
    16. MATH_ERRNO
    17. MATH_ERREXCEPT
    18. math_errhandling
    1. float_t
    2. double_t
  2. 三角関数
    1. double sin(double x)
    2. double cos(double x)
    3. double tan(double x)
    4. double asin(double x)
    5. double acos(double x)
    6. double atan(double x)
    7. double atan2(double y, double x)
  3. 双曲線関数
    1. double sinh(double x)
    2. double cosh(double x)
    3. double tanh(double x)
    4. double asinh(double x)
    5. double acosh(double x)
    6. double atanh(double x)
  4. 指数と対数関数
    1. double exp(double x)
    2. double frexp(double value, int *exp)
    3. double ldexp(double x, int exp)
    4. double log(double x)
    5. double log10(double x)
    6. double modf(double value, double *iptr)
    7. double exp2(double x)
    8. double expm1(double x)
    9. int ilogb(double x)
    10. double log1p(double x)
    11. double log2(double x)
    12. double scalbn(double x, int n)
    13. double scalbln(double x, long int n)
    14. double logb(double x)
  5. pow関数
    1. double pow(double x, double y)
    2. double sqrt(double x)
    3. double cbrt(double x)
    4. double hypot(double x, double y)
  6. 誤差と絶対値関数
    1. double fabs(double x)
    2. double fma(double x, double y, double z)
  7. 浮動所数点操作関数
    1. int fpclassify(real-floating x)
    2. int isfinite(real-floating x)
    3. int isinf(real-floating x)
    4. int isnan(real-floating x)
    5. int isnormal(real-floating x)
    6. int signbit(real-floating x)
  8. 浮動小数点比較関数
    1. int isgreater(real-floating x, real-floating y)
    2. int isgreaterequal(real-floating x, real-floating y)
    3. int isless(real-floating x, real-floating y)
    4. int islessequal(real-floating x, real-floating y)
    5. int islessgreater(real-floating x, real-floating y)
    6. int isunordered(real-floating x, real-floating y)
  9. その他の数学関数
    1. double ceil(double x)
    2. double floor(double x)
    3. double fmod(double x, double y)
    4. double round(double x)
    5. long int lrint(double x)
    6. long int lround(double x)
    7. double nearbyint(double x)
    8. double rint(double x)
    9. long long int llrint(double x)
    10. long long int llround(double x)
    11. double fdim(double x, double y)
    12. double fmax(double x, double y)
    13. double fmin(double x, double y)
    14. double remainder(double x, double y)
    15. double remquo(double x, double y, int *quo)
    16. double nan(const char *tagp)
    17. double nextafter(double x, double y)
    18. double nexttoward(double x, long double y)
    19. double erf(double x)
    20. double erfc(double x)
    21. double lgamma(double x)
    22. double tgamma(double x)
    23. double trunc(double x)
    24. double copysign(double x, double y)
スポンサーリンク

マクロ定数

HUGE_VAL

倍精度浮動小数点数(double型)の正の無限大を表す定数です。
数学関数や計算の結果が正の無限大を返す場合に使用されます。
この値は、数学的な演算の結果が有効な範囲を超えた場合やオーバーフローが発生した場合に返されることがあります。

HUGE_VALF

単精度浮動小数点数(float型)の正の無限大を表す定数です。
HUGE_VALと同様に数学関数や計算の結果が正の無限大を返す場合に使用されます。
この値は、数学的な演算の結果が有効な範囲を超えた場合やオーバーフローが発生した場合に返されることがあります。

HUGE_VALL

拡張精度浮動小数点数(long double型)の正の無限大を表す定数です。
HUGE_VALと同様に数学関数や計算の結果が正の無限大を返す場合に使用されます。
この値は、数学的な演算の結果が有効な範囲を超えた場合やオーバーフローが発生した場合に返されることがあります。

INFINITY

正の、または符号無しの無限大を表すfloat型の定数式です。
それが利用不可の場合は、コンパイル時においてオーバフローするfloat型の正の定数となります。

NAN

QNaNを表すfloat型の定数式です。
処理系がfloat型のQNaNをサポートしている場合にのみ定義されます。

FP_INFINITE

値を分類するための整数定数式です。
fpclassify()マクロ関数の戻り値に使用されます。

FP_NAN

値を分類するための整数定数式です。
fpclassify()マクロ関数の戻り値に使用されます。

FP_NORMAL

値を分類するための整数定数式です。
fpclassify()マクロ関数の戻り値に使用されます。

FP_SUBNORMAL

値を分類するための整数定数式です。
fpclassify()マクロ関数の戻り値に使用されます。

FP_ZERO

値を分類するための整数定数式です。
fpclassify()マクロ関数の戻り値に使用されます。

FP_FAST_FMA

fma(a,b,c) 関数が、a * b + c と計算する速さより、同じか、より速く計算できる場合に定義されます。

FP_FAST_FMAF

fmaf(a,b,c) 関数が、a * b + c と計算する速さより、同じか、より速く計算できる場合に定義されます。

FP_FAST_FMAL

fmal(a,b,c) 関数が、a * b + c と計算する速さより、同じか、より速く計算できる場合に定義されます。

FP_ILOGB0

ilogb(0)の戻り値である整数定数式です。
INT_MINまたは-INT_MAX。

FP_ILOGBNAN

ilogb(NaN)の戻り値である整数定数式です。
INT_MAXまたはINT_MIN。

MATH_ERRNO

定数(1)が定義されます。

MATH_ERREXCEPT

定数(2)が定義されます。

math_errhandling

数学関数がエラーをどのように処理するかを指定するために使用されます。
math_errhandlingマクロは、以下のいくつかの定数を定義しています。

math_errhandlingの値マクロ名意味
0エラー処理がサポートされていないことを示します。
1MATH_ERRNO数学関数がエラーを検出すると、関数はエラーコードを設定します。このフラグが設定されると、関数はグローバル変数errnoを使用してエラーコードを設定します。
2MATH_ERREXCEPT数学関数がエラーを検出すると、関数は浮動小数点例外を発生させます。このフラグが設定されると、関数は浮動小数点例外を発生させるために浮動小数点制御ワードを変更します。

MATH_ERRNO、MATH_ERREXCEPT、あるいは両方のビット単位の論理和のいずれか。

float.hで定義されている FLT_EVAL_METHOD の値によって、float_t型とdouble_t型の定義が決まります。

FLT_EVA_METHODの値float_t型の定義double_t型の定義
0float型double型
1double型double型
2long double型long double型
上記以外実装依存実装依存

これらの型は、プログラムが特定の浮動小数点数の幅に依存することなく、浮動小数点数の計算や変換を行うために使用されます。例えば、プログラムが異なるプラットフォームやコンパイラ上で実行される場合でも、浮動小数点数の幅が異なっていても、float_tdouble_tを使用することで互換性を確保することができます。

float_t

単精度浮動小数点数(float型)の正確な幅を表すために使用されます。
一般的に、float_tは32ビット幅であることが期待されますが、実装によって異なる場合があります。

double_t

倍精度浮動小数点数(double型)の正確な幅を表すために使用されます。
一般的に、double_tは64ビット幅であることが期待されますが、実装によって異なる場合があります。

三角関数

double sin(double x)

// 宣言
float sinf(float x);
double sin(double x);
long double sinl(long double x);

引数xのラジアン値の正弦(サイン)を計算します。
-1~1の正弦値が返されます。

使用例:

#include <stdio.h>
#include <math.h>

int main(void)
{
    double x = 1.0;  // ラジアンで指定された角度
    double result = sin(x);

    printf("sin(%.2f) = %.2f\n", x, result);

    return 0;
}

実行結果:

sin(1.00) = 0.84

double cos(double x)

// 宣言
float cosf(float x);
double cos(double x);
long double cosl(long double x);

引数xのラジアン値の余弦(コサイン)を計算します。
-1~1の余弦値が返されます。

使用例:

#include <stdio.h>
#include <math.h>

int main(void)
{
    double x = 1.0;  // ラジアンで指定された角度
    double result = cos(x);

    printf("cos(%.2f) = %.2f\n", x, result);

    return 0;
}

実行結果:

cos(1.00) = 0.54

double tan(double x)

// 宣言
float tanf(float x);
double tan(double x);
long double tanl(long double x);

引数xのラジアン値の正接(タンジェント)を計算します。
正接値が返されます。

使用例:

#include <stdio.h>
#include <math.h>

int main(void)
{
    double x = 1.0;  // ラジアンで指定された角度
    double result = tan(x);

    printf("tan(%.2f) = %.2f\n", x, result);

    return 0;
}

実行結果:

tan(1.00) = 1.56

double asin(double x)

// 宣言
float asinf(float x);
double asin(double x);
long double asinl(long double x);

引数xの逆正弦(アークサイン)を計算します。
引数xのアークサインを計算し、結果を浮動小数点数で返します。
引数xが-1~+1の範囲内にない場合は定義域エラーが発生します。
返される結果は、-π/2~+π/2の弧度法(ラジアン)で表されます。

使用例:

#include <stdio.h>
#include <math.h>

int main(void)
{
    double data1  = 0.5;
    double result = asin(data1);

    printf("asin(%.2f) = %.2f\n", data1, result);

    return 0;
}

実行結果:

asin(0.50) = 0.52

double acos(double x)

// 宣言
float acosf(float x);
double acos(double x);
long double acosl(long double x);

引数xの逆余弦(アークコサイン)を計算します。
引数xのアークコサインを計算し、結果を浮動小数点数で返します。
引数xが-1~+1の範囲内にない場合は定義域エラーが発生します。
返される結果は、0~+πの弧度法(ラジアン)で表されます。

使用例:

#include <stdio.h>
#include <math.h>

int main(void)
{
    double data1  = 0.5;
    double result = acos(data1);

    printf("acos(%.2f) = %.2f\n", data1, result);

    return 0;
}

実行結果:

acos(0.50) = 1.05

double atan(double x)

// 宣言
float atanf(float x);
double atan(double x);
long double atanl(long double x);

引数xの逆正接(アークタンジェント)を計算を計算します。
引数xの範囲は無制限です。任意の実数値を受け取ることができます。
-π/2~+π/2の範囲のラジアンの逆正接値が返されます。

使用例:

#include <stdio.h>
#include <math.h>

int main(void)
{
    double data1  = 1.0;
    double result = atan(data1);

    printf("atan(%.2f) = %.2f\n", data1, result);

    return 0;
}

実行結果:

atan(1.00) = 0.79

double atan2(double y, double x)

// 宣言
float atan2f(float y, float x);
double atan2(double y, double x);
long double atan2l(long double y, long double x);

引数の逆正接(アークタンジェント)を計算します。
引数の範囲は無制限です。任意の実数値を受け取ることができます。
xとyが0の場合、定義域エラーが発生する可能性があります。
返される結果は、-π~+πの弧度法(ラジアン)で表されます。

使用例:

#include <stdio.h>
#include <math.h>

int main(void)
{
    double y = 1.0;
    double x = 1.0;
    double result = atan2(y, x);

    printf("atan2(%.2f, %.2f) = %.2f\n", y, x, result);

    return 0;
}

実行結果:

atan2(1.00, 1.00) = 0.79

スポンサーリンク

双曲線関数

double sinh(double x)

// 宣言
float sinhf(float x);
double sinh(double x);
long double sinhl(long double x);

引数xの双曲線正弦(ハイパボリックサイン)を計算します。
xの絶対値が大きすぎる場合は値域エラーが発生します。
双曲線正弦値が返されます。

使用例:

#include <stdio.h>
#include <math.h>

int main(void)
{
    double x = 1.0;
    double result = sinh(x);

    printf("sinh(%.2f) = %.2f\n", x, result);

    return 0;
}

実行結果:

sinh(1.00) = 1.18

double cosh(double x)

// 宣言
float coshf(float x);
double cosh(double x);
long double coshl(long double x);

引数xの双曲線余弦(ハイパボリックコサイン)を計算します。
xの絶対値が大きすぎる場合は値域エラー発生が発生します。
非負の双曲線余弦値が返されます。

使用例:

#include <stdio.h>
#include <math.h>

int main(void)
{
    double x = 1.0;
    double result = cosh(x);

    printf("cosh(%.2f) = %.2f\n", x, result);

    return 0;
}

実行結果:

cosh(1.00) = 1.54

double tanh(double x)

// 宣言
float tanhf(float x);
double tanh(double x);
long double tanhl(long double x);

引数xの双曲線正接(ハイパボリックタンジェント)を計算します。
双曲線正接値が返されます。

使用例:

#include <stdio.h>
#include <math.h>

int main(void)
{
    double x = 1.0;
    double result = tanh(x);

    printf("tanh(%.2f) = %.2f\n", x, result);

    return 0;
}

実行結果:

tanh(1.00) = 0.76

double asinh(double x)

// 宣言
float asinhf(float x);
double asinh(double x);
long double asinhl(long double x);

引数xの逆双曲線正弦(アークハイパボリックサイン)を計算します。
双曲線逆正弦値が返されます。

使用例:

#include <stdio.h>
#include <math.h>

int main(void)
{
    double x = 2.0;
    double result = asinh(x);

    printf("asinh(%.2f) = %.2f\n", x, result);

    return 0;
}

実行結果:

asinh(2.00) = 1.44

double acosh(double x)

// 宣言
float acoshf(float x);
double acosh(double x);
long double acoshl(long double x);

引数xの非負の逆双曲線余弦(アークハイパボリックコサイン)を計算します。
xが1未満の場合、定義域エラーが発生します。
0~+∞の双曲線逆余弦値が返されます。

使用例:

#include <stdio.h>
#include <math.h>

int main(void)
{
    double x = 2.0;
    double result = acosh(x);

    printf("acosh(%.2f) = %.2f\n", x, result);

    return 0;
}

実行結果:

acosh(2.00) = 1.32

double atanh(double x)

// 宣言
float atanhf(float x);
double atanh(double x);
long double atanhl(long double x);

引数xの逆双曲線逆正接(アークハイパボリックタンジェント)を計算します。
xが-1~+1の範囲内にない場合は、定義域エラーが発生します。
xが-1、または+1の場合は、値域エラーが発生する可能性があります。
双曲線逆正接値が返されます。

使用例:

#include <stdio.h>
#include <math.h>

int main(void)
{
    double x = 0.5;
    double result = atanh(x);

    printf("atanh(%.2f) = %.2f\n", x, result);

    return 0;
}

実行結果:

atanh(0.50) = 0.55

指数と対数関数

double exp(double x)

// 宣言
float expf(float x);
double exp(double x);
long double expl(long double x);

引数xの指数関数を計算します。(自然対数の底eのx乗を計算します)
引数xの絶対値が大きすぎる場合は、値域エラーが発生します。
eのx乗の値が返されます。

使用例:

#include <stdio.h>
#include <math.h>

int main(void)
{
    double x = 1.0;
    double result = exp(x);

    printf("exp(%.2f) = %.2f\n", x, result);

    return 0;
}

実行結果:

exp(1.00) = 2.72

double frexp(double value, int *exp)

// 宣言
float frexpf(float value, int *exp);
double frexp(double value, int *exp);
long double frexpl(long double value, int *exp);

浮動小数点数を正規化した数と2の整数べき乗に分割し、その整数をexpが指すオブジェクトに格納します。
次の二つの条件を満足する値xが返されます。
 条件①:xの絶対値が1/2 ~ 1の範囲に含まれる、または0に等しい。
 条件②:valueが2の*exp乗のx倍に等しい。valueが0の場合、xおよび*expの値は0。

使用例:

#include <stdio.h>
#include <math.h>

int main(void)
{
    double x = 123.45;
    int exponent;
    double mantissa = frexp(x, &exponent);

    printf("Number   : %.2f\n", x);
    printf("Mantissa : %.2f\n", mantissa);
    printf("Exponent : %d\n", exponent);

    return 0;
}

実行結果:

Number : 123.45
Mantissa : 0.96
Exponent : 7