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 <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>開発者はより簡潔で汎用的なコードを記述できます。