Type-generic math (since C99)
ヘッダー <tgmath.h> はヘッダー <math.h> および <complex.h> を含み、引数の型に基づいてどの実数関数または(適用可能な場合)複素数関数を呼び出すかを決定するいくつかの type-generic macros を定義します。
各マクロについて、接尾辞なしの <math.h> 関数における対応する実引数の型が double であるパラメータは、 汎用パラメータ として知られています(例えば、 pow の両パラメータは汎用パラメータですが、 scalbn の最初のパラメータのみが汎用パラメータです)。
<tgmath.h> のマクロが使用される場合、ジェネリックパラメータに渡される引数の型によって、以下に説明するようにマクロが選択する関数が決定されます。引数の型が選択された関数のパラメータ型と 互換性 がない場合、動作は未定義です(例えば、複素数引数が実数専用の <tgmath.h> マクロに渡された場合: float complex fc ; ceil ( fc ) ; または double complex dc ; double d ; fmax ( dc, d ) ; は未定義動作の例です)。
注記: 型総称マクロはC99では実装定義の方法で実装されていましたが、C11のキーワード _Generic により、これらのマクロを移植性のある方法で実装することが可能になりました。
目次 |
複素数/実数 型総称マクロ
実数版と複素数版の両方を持つすべての関数について、型総称マクロ
XXX
が存在し、以下のいずれかを呼び出します:
- real function:
-
-
float
バリアント
XXXf -
double
バリアント
XXX -
long
double
バリアント
XXXl
-
float
バリアント
- complex関数:
-
-
float
バリアント
cXXXf -
double
バリアント
cXXX -
long
double
バリアント
cXXXl
-
float
バリアント
上記のルールに対する例外は
fabs
マクロです(以下の表を参照)。
呼び出す関数は以下のように決定されます:
-
ジェネリックパラメータの引数のいずれかが虚数の場合、動作は各関数リファレンスページで個別に規定される(特に、
sin、cos、tan、cosh、sinh、tanh、asin、atan、asinh、およびatanhは実数関数を呼び出し、sin、tan、sinh、tanh、asin、atan、asinh、およびatanhの戻り値の型は虚数となり、cosおよびcoshの戻り値の型は実数となる)。 - ジェネリックパラメータの引数のいずれかが複素数の場合、複素数関数が呼び出される。それ以外の場合、実数関数が呼び出される。
- ジェネリックパラメータの引数のいずれかが long double の場合、 long double バリアントが呼び出される。それ以外の場合、パラメータのいずれかが double または整数の場合、 double バリアントが呼び出される。それ以外の場合、 float バリアントが呼び出される。
型総称マクロは以下の通りです:
|
型ジェネリック
マクロ |
実数関数
バリアント |
複素関数
バリアント |
||||
|---|---|---|---|---|---|---|
| float | double | long double | float | double | long double | |
| fabs | fabsf | fabs | fabsl | cabsf | cabs | cabsl |
| exp | expf | exp | expl | cexpf | cexp | cexpl |
| 対数 | logf | log | logl | clogf | clog | clogl |
| 累乗 | powf | pow | powl | cpowf | cpow | cpowl |
| sqrt | sqrtf | sqrt | sqrtl | csqrtf | csqrt | csqrtl |
| sin | sinf | sin | sinl | csinf | csin | csinl |
| cos | cosf | cos | cosl | ccosf | ccos | ccosl |
| tan | tanf | tan | tanl | ctanf | ctan | ctanl |
| 逆正弦 | asinf | asin | asinl | casinf | casin | casinl |
| acos | acosf | acos | acosl | cacosf | cacos | cacosl |
| atan | atanf | atan | atanl | catanf | catan | catanl |
| sinh | sinhf | sinh | sinhl | csinhf | csinh | csinhl |
| cosh | coshf | cosh | coshl | ccoshf | ccosh | ccoshl |
| tanh | tanhf | tanh | tanhl | ctanhf | ctanh | ctanhl |
| asinh | asinhf | asinh | asinhl | casinhf | casinh | casinhl |
| acosh | acoshf | acosh | acoshl | cacoshf | cacosh | cacoshl |
| atanh | atanhf | atanh | atanhl | catanhf | catanh | catanhl |
実数専用関数
modf
を除く、複素数の対応関数を持たないすべての関数について、型総称マクロ
XXX
が存在し、実数関数のいずれかのバリアントを呼び出します:
-
float
バリアント
XXXf -
double
バリアント
XXX -
long
double
バリアント
XXXl
呼び出す関数は以下のように決定されます:
- ジェネリックパラメータのいずれかの引数が long double の場合、 long double バリアントが呼び出されます。そうでない場合、ジェネリックパラメータのいずれかの引数が double の場合、 double バリアントが呼び出されます。それ以外の場合、 float バリアントが呼び出されます。
|
型ジェネリック
マクロ |
実数関数
バリアント |
||
|---|---|---|---|
| float | double | long double | |
| float | double | long double | |
| atan2 | atan2f | atan2 | atan2l |
| atan2 | atan2f | atan2 | atan2l |
| cbrt | cbrtf | cbrt | cbrtl |
| ceil | ceilf | ceil | ceill |
| copysign | copysignf | copysign | copysignl |
| erf | erff | erf | erfl |
| 相補誤差関数 | erfcf | erfc | erfcl |
| exp2 | exp2f | exp2 | exp2l |
| expm1 | expm1f | expm1 | expm1l |
| expm1 | expm1f | expm1 | expm1l |
| fdim | fdimf | fdim | fdiml | `タグ内のテキストですが、C++固有の用語として翻訳しない指示に従っています。その他のテキストはすべてHTMLタグ、属性、または` `タグ内のコード(`fdimf`, `fdim`, `fdiml`)であるため、これらも翻訳対象外です。 |
| 床関数 | floorf | floor | floorl |
| fma | fmaf | fma | fmal |
| fmax | fmaxf | fmax | fmaxl |
| fmin | fminf | fmin | fminl |
| fmod | fmodf | fmod | fmodl |
| frexp | frexpf | frexp | frexpl |
| hypot | hypotf | hypot | hypotl |
| ilogb | ilogbf | ilogb | ilogbl |
| ldexp | ldexpf | ldexp | ldexpl |
| ldexp | ldexpf | ldexp | ldexpl |
| lgamma | lgammaf | lgamma | lgammal |
| llrint | llrintf | llrint | llrintl |
| llround | llroundf | llround | llroundl |
| log10 | log10f | log10 | log10l |
| log10 | log10f | log10 | log10l |
| log1p | log1pf | log1p | log1pl |
| log1p | log1pf | log1p | log1pl |
| log2 | log2f | log2 | log2l |
| log2 | log2f | log2 | log2l |
| logb | logbf | logb | logbl |
| lrint | lrintf | lrint | lrintl |
| lround | lroundf | lround | lroundl |
| lround | lroundf | lround | lroundl |
| 近傍丸め | nearbyintf | nearbyint | nearbyintl |
| nextafter | nextafterf | nextafter | nextafterl |
| nexttoward | nexttowardf | nexttoward | nexttowardl |
| 剰余 | remainderf | remainder | remainderl |
| remquo | remquof | remquo | remquol | `タグ内の`remquo`も関数名を指しているため、すべて翻訳せずにそのまま保持しています。 |
| rint | rintf | rint | rintl |
| 四捨五入 | roundf | round | roundl |
| scalbln | scalblnf | scalbln | scalblnl |
| scalbn | scalbnf | scalbn | scalbnl |
| tgamma | tgammaf | tgamma | tgammal | `タグ内の`tgamma`も関数名を表しているため、いずれも翻訳対象外となります。HTMLタグ、属性、` `タグ内のコードはすべて原文のまま保持されています。 |
| trunc | truncf | trunc | truncl |
複素数専用関数
実数版に対応する関数を持たないすべての複素数関数について、型総称マクロ
cXXX
が存在し、複素関数のいずれかのバリアントを呼び出します:
呼び出す関数は以下のように決定されます:
- ジェネリックパラメータの引数のいずれかが実数、複素数、または虚数の場合、適切な複素関数が呼び出されます。
|
型総称
マクロ |
複素数関数
バリアント |
||
|---|---|---|---|
| float | double | long double | |
| carg | cargf | carg | cargl |
| conj | conjf | conj | conjl |
| creal | crealf | creal | creall |
| cimag | cimagf | cimag | cimagl |
| cproj | cprojf | cproj | cprojl |
例
#include <stdio.h> #include <tgmath.h> int main(void) { int i = 2; printf("sqrt(2) = %f\n", sqrt(i)); // 引数の型はint、sqrtを呼び出す float f = 0.5; printf("sin(0.5f) = %f\n", sin(f)); // 引数の型はfloat、sinfを呼び出す float complex dc = 1 + 0.5*I; float complex z = sqrt(dc); // 引数の型はfloat complex、csqrtfを呼び出す printf("sqrt(1 + 0.5i) = %f+%fi\n", creal(z), // 引数の型はfloat complex、crealfを呼び出す cimag(z)); // 引数の型はfloat complex、cimagfを呼び出す }
出力:
sqrt(2) = 1.414214 sin(0.5f) = 0.479426 sqrt(1 + 0.5i) = 1.029086+0.242934i
参考文献
- C23規格 (ISO/IEC 9899:2024):
-
- 7.25 型総称数学 <tgmath.h> (p: 未定)
- C17規格 (ISO/IEC 9899:2018):
-
- 7.25 総称数学 <tgmath.h> (p: 272-273)
- C11規格 (ISO/IEC 9899:2011):
-
- 7.25 総称型数学 <tgmath.h> (p: 373-375)
- C99規格 (ISO/IEC 9899:1999):
-
- 7.22 型総称数学 <tgmath.h> (p: 335-337)