C 標準ライブラリ<tgmath.h>

<tgmath.h>は C 標準ライブラリ内のヘッダファイルであり、型総称数学関数を提供します。(Type-Generic Math Functions)。

<tgmath.h>このライブラリは C99 標準で導入され、開発者が異なる型の数学関数(例:float、doubleとlong double)を統一された関数名で呼び出せるようにし、関数の具体的な型を明示的に指定する必要をなくします。

<tgmath.h>の主な目的は次のとおりです:

  • 数学関数の使用を簡素化し、異なる型(例:float、double、long double)に対して異なる関数(例:sinf、sin、sinl)。

  • を明示的に呼び出すことを避け、コードの可読性と保守性を向上させます。

  • 複素数型の数学関数をサポートします。


1、型総称マクロ

<tgmath.h>一連の型総称マクロを定義します。これらのマクロは、引数の型に基づいて自動的に適切な数学関数を選択します。例:

  • sin(x):もしxであるfloatの場合、sinf(x)を呼び出します。もしxであるdoubleの場合、sin(x)を呼び出します。もしxであるlong doubleの場合、sinl(x)。

  • sqrt(x)を呼び出します。:もしxであるfloatの場合、sqrtf(x)を呼び出します。もしxであるdoubleの場合、sqrt(x)を呼び出します。もしxであるlong doubleの場合、sqrtl(x)。

これらのマクロは以下の型の引数をサポートします:

  • 実数型:float、double、long double。

  • 複素数型:float complex、double complex、long double complex。


2、サポートされる関数

<tgmath.h>以下の型総称数学関数をサポートします:

基本数学関数

関数 説明
sin 正弦関数
cos 余弦関数
tan 正接関数
asin 逆正弦関数
acos 逆余弦関数
atan 逆正接関数
atan2 2つの引数を取る逆正接関数
sinh 双曲線正弦関数
cosh 双曲線余弦関数
tanh 双曲線正接関数
asinh 逆双曲線正弦関数
acosh 逆双曲線余弦関数
atanh 逆双曲線正接関数

指数関数と対数関数

関数 説明
exp 指数関数
log 自然対数関数
log10 常用対数関数
pow 冪関数

その他の関数

関数 説明
sqrt 平方根関数
fabs 絶対値関数
ceil 切り上げ関数
floor 切り捨て関数
fmod 浮動小数点剰余関数

3、例

以下は<tgmath.h>を使用した例で、型総称数学関数の使用方法を示しています:

例

#include <stdio.h>
#include <tgmath.h>

int main() {
    // 実数型
    float f = 1.5f;
    double d = 2.5;
    long double ld = 3.5L;

    // 型総称関数を使用
    printf("sin(f) = %f\n", sin(f));       // sinf を呼び出す
    printf("sin(d) = %f\n", sin(d));       // sin を呼び出す
    printf("sin(ld) = %Lf\n", sin(ld));    // sinl を呼び出す

    // 複素数型
    double complex z = 1.0 + 2.0 * I;

    // 型総称関数を使用
    double complex sqrt_z = sqrt(z);
    printf("sqrt(z) = %f + %fi\n", creal(sqrt_z), cimag(sqrt_z));

    return 0;
}

出力結果:

sin(f) = 0.997495
sin(d) = 0.598472
sin(ld) = 0.350783
sqrt(z) = 1.272020 + 0.786151i

4、注意事項

  • <tgmath.h>C99 以降でのみ使用できます。

  • 型総称マクロは引数の型に基づいて自動的に適切な関数を選択するため、引数の型が明確でなければなりません。

  • 引数の型が不明確な場合(例:整数定数)、コンパイラはデフォルトのdoubleバージョンを選択する可能性があります。

  • 複素数型の関数では、<complex.h>ヘッダファイルをインクルードする必要があります。


5、実装原理

<tgmath.h>の実装は C 言語の総称選択メカニズム(_Genericキーワード)に依存しています。例えば、sinマクロの定義は次のようになります:

#define sin(x) _Generic((x), \
    float: sinf,             \
    double: sin,             \
    long double: sinl        \
)(x)

_Genericキーワードはxの型に基づいて適切な関数を選択します。

<tgmath.h>は型総称数学関数を提供し、異なる数値型(例:float、double、long doubleや複素数型)の数学関数呼び出しを簡素化します。これは C99 標準における重要な特性であり、複数の数値型を処理する必要がある科学計算や工学的応用に特に適しています。を使用することで、<tgmath.h>開発者はより簡潔で汎用的なコードを記述できます。

その他の拡張