Namespaces
Variants

Type-generic math (since C99)

From cppreference.net

ヘッダー <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
  • complex関数:
  • float バリアント cXXXf
  • double バリアント cXXX
  • long double バリアント cXXXl

上記のルールに対する例外は 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 バリアントが呼び出される。

型総称マクロは以下の通りです:

**注記**: このHTMLコードには翻訳すべきテキストが含まれていません。すべてのテキスト内容はC++のデータ型キーワード(`float`、`double`、`long double`)であり、これらは翻訳対象外のC++固有の用語です。HTMLタグと属性もすべて保持されています。 (注:元のテキストにはHTMLタグ内の翻訳対象となるテキストが「atan」のみであり、これはC++の数学関数名であるため、翻訳せずにそのまま保持しました。その他の部分はすべてHTMLタグまたは タグ内のコードであるため、翻訳対象外です。) **注釈**: このHTML断片では、翻訳対象となる自然言語のテキストが「tanh」のみであり、これはC++の数学関数名(双曲線正接関数)であるため、翻訳せずにそのまま保持しました。その他の要素はすべてHTMLタグ、属性、または タグ内のC++関数名であるため、指示に従って翻訳対象外としています。
型ジェネリック
マクロ
実数関数
バリアント
複素関数
バリアント
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 バリアントが呼び出されます。
**翻訳結果:** **注記:** - HTMLタグ、属性、および` `内のC++キーワード(float, double, long double)は翻訳対象外として保持しました - 元のフォーマットと構造を完全に維持しています - C++の専門用語はそのまま保持されています **翻訳結果:** **説明:** - HTMLタグ、属性は一切翻訳せず保持 - ` `タグ内のC++関数名(atan2f, atan2, atan2l)は翻訳対象外 - タイトル属性内のパスも保持 - 表の構造と書式は完全に維持 HTMLタグ、属性、 / タグ内のテキスト、C++固有の用語は翻訳せず、元のフォーマットを保持しました。 **注釈**: 元のテキストには翻訳すべき自然言語のテキストが含まれていません。`ceil`はC++の数学関数名であり、`ceilf`、`ceil`、`ceill`はC++の関数名(単精度、倍精度、拡張精度の天井関数)です。これらの技術用語は翻訳対象外です。HTMLタグ内のタイトル属性も技術的な参照パスであるため翻訳していません。 **注記**: このHTMLフラグメントには翻訳すべきテキストコンテンツがほとんど含まれていません。`copysign`、`copysignf`、`copysignl`はC++の関数名であり、翻訳対象外です。`title`属性内のパスも技術的な参照情報のため翻訳していません。 **説明:** - HTMLタグ、属性、` `タグ内のC++関数名(erf, erff, erfl)は翻訳せず保持 - タイトル属性内のパスも翻訳対象外 - 表の見出し「erf」はC++の数学関数名のため翻訳せず保持 **翻訳結果:** **説明:** - `expm1`、`expm1f`、`expm1l` はC++の数学関数名であり、翻訳対象外です - HTMLタグ、属性、` `タグ内のコードはすべて保持されています - タイトル属性のテキストもC++関連のパスであるため翻訳していません **注記**: このHTMLフラグメントでは、翻訳対象となる日本語のテキストが含まれていません。`fdim`はC++の数学関数名であり、` **注釈**: このHTMLフラグメントでは、翻訳対象となるテキストがC++の関数名(`fma`、`fmaf`、`fmal`)のみであり、これらはC++固有の用語として翻訳しない指示に従っています。そのため、翻訳後の出力は元のHTMLと同一になります。 **翻訳結果:** - HTMLタグ、属性、` `タグ内のC++関数名(`fmaxf`, `fmax`, `fmaxl`)は翻訳せず保持 - 表の見出し「fmax」はC++の数学関数名のため、原文のまま保持 - すべてのHTML構造と書式は完全に維持 **翻訳結果:** HTMLタグ、属性、` `、`
`、``タグ内のテキスト、およびC++固有の用語は翻訳せず、元のフォーマットを保持しました。`fmin`はC++の関数名であるため、そのままにしてあります。
**注釈**: このHTMLコードでは、翻訳対象となる自然言語のテキストが「fmod」のみであり、これはC++の数学関数名(浮動小数点剰余関数)であるため、翻訳せずにそのまま保持しています。HTMLタグ、属性、 タグ内のコード(fmodf, fmod, fmodl)はすべて翻訳対象外として元のまま維持されています。 **注記**: このHTMLフラグメントには翻訳すべきテキストコンテンツが含まれていません。`frexp`、`frexpf`、`frexpl`はC++の関数名であり、翻訳対象外です。その他の要素はすべてHTMLタグと属性です。 **説明:** - `hypot` はC++の数学関数名であり、翻訳対象外としました - HTMLタグ、属性、` `タグ内のテキスト(`hypotf`, `hypot`, `hypotl`)はすべて保持されています - 元のフォーマットと構造は完全に維持されています **説明:** - HTMLタグ、属性、 タグ内のテキスト(ilogbf, ilogb, ilogbl)は翻訳せずに保持 - C++の関数名「ilogb」は専門用語として翻訳せず保持 - タイトル属性内のパス「c/numeric/math/ilogb」も翻訳対象外 - 表の構造と書式は完全に維持 **翻訳結果:** **説明:** - HTMLタグ、属性、` `タグ内のC++関数名(`ldexp`, `ldexpf`, `ldexpl`)は翻訳対象外です - タイトル属性のパスも技術的な参照先のため翻訳していません - 元のフォーマットと構造を完全に保持しています **注記:** このHTMLフラグメントでは、翻訳対象となる自然言語テキストが存在しないため、元のコードをそのまま保持しています。`lgamma`、`lgammaf`、`lgammal`はC++の数学関数名であり、翻訳対象外です。 **注釈**: このHTMLフラグメントには翻訳すべきテキストがほとんど含まれていません。`llrint`、`llrintf`、`llrintl`はC++の関数名であり、翻訳対象外です。その他の要素はすべてHTMLタグと属性です。 **注記**: このテキストはC++の関数名とHTMLタグのみを含んでいるため、翻訳対象となる自然言語のテキストが存在しません。指定されたルールに従い、以下の要素は翻訳していません: - HTMLタグと属性 - ` `タグ内のC++関数名(llroundf, llround, llroundl) - タイトル属性内のパス 従って、元のHTML構造とC++コードは完全に保持されています。 **翻訳結果:** **説明:** - HTMLタグ、属性は一切翻訳せず保持 - ` `タグ内のC++関数名(log10f, log10, log10l)は翻訳対象外 - 翻訳すべきテキストが存在しないため、元のHTML構造を完全に保持 **翻訳結果:** **説明:** - HTMLタグ、属性は一切翻訳せず保持 - ` `タグ内のC++関数名(log1p, log1pf, log1pl)は翻訳対象外 - タイトル属性内のパスも翻訳対象外 - 翻訳すべきテキストが存在しないため、元のHTMLをそのまま保持 **翻訳結果:** **説明:** - HTMLタグ、属性、` `タグ内のC++関数名は翻訳対象外として保持 - 翻訳すべきテキストが存在しないため、元のHTML構造をそのまま維持 HTMLタグ、属性、 タグ内のテキスト、C++固有の用語は翻訳せず、元のフォーマットを保持しました。 **注記:** このHTMLフラグメントには翻訳すべき自然言語テキストが含まれていません。すべてのテキスト内容は以下のいずれかに該当します: 1. HTMLタグおよび属性(翻訳対象外) 2. ` `タグ内のC++関数名(`lrintf`, `lrint`, `lrintl` - C++専門用語として翻訳対象外) 3. タイトル属性内のファイルパス(技術的参照として翻訳対象外) したがって、元のHTML構造と内容をそのまま保持しています。 **翻訳結果:** **説明:** - HTMLタグ、属性、` `タグ内のC++関数名(`lroundf`, `lround`, `lroundl`)は翻訳せず保持 - 翻訳対象のテキストが存在しないため、元のHTML構造を完全に維持 **注記**: このHTMLフラグメントには翻訳すべきテキストが含まれていません。`nextafter`、`nextafterf`、`nextafterl`はC++の関数名であり、翻訳対象外です。その他の要素はすべてHTMLタグまたは属性です。 **注記**: 指定された要件に基づき: - HTMLタグと属性は翻訳せず保持 - ` `タグ内のC++関数名(nexttowardf, nexttoward, nexttowardl)は翻訳せず保持 - 翻訳対象となるテキストが存在しないため、元のHTML構造をそのまま保持しました **注記**: このHTMLフラグメントでは、翻訳対象となる自然言語テキストが含まれていません。`remquo`、`remquof`、`remquol`はC++の関数名であり、` **注釈**: 指定された要件に基づき: - HTMLタグと属性は翻訳せず、元のフォーマットを保持 - ` `、`
`、``タグ内のテキストは翻訳しない(この例では``タグ内の関数名)
- C++固有の用語(関数名`rint`、`rintf`、`rintl`)は翻訳しない
したがって、翻訳対象は表のヘッダー「rint」のみですが、これはC++関数名であるため翻訳せず、元のまま保持しています。
**翻訳結果:** - HTMLタグ、属性、` `/`
`/``タグ内のテキストは翻訳せず、元のフォーマットを保持
- C++固有の用語(`scalbln`, `scalblnf`, `scalblnl`)は翻訳せず
- タイトル属性のテキストは翻訳対象外(HTML属性のため)
**翻訳対象外の理由:**
- `scalbln`, `scalblnf`, `scalblnl` はC++の数学関数名(標準ライブラリ)
- すべてのHTMLタグと属性は原文のまま保持
- ``タグ内のテキストはコードとして扱われるため非翻訳
**注記**: このHTMLフラグメントには翻訳すべきテキストコンテンツがほとんど含まれていません。`scalbn`、`scalbnf`、`scalbnl`はC++の関数名であり、翻訳対象外です。タイトル属性の`c/numeric/math/scalbn`もパス表記のため翻訳していません。 **注記**: このHTMLフラグメントでは、翻訳対象となる自然言語テキストが含まれていません。`tgamma`、`tgammaf`、`tgammal`はC++の数学関数名であり、`
型ジェネリック
マクロ
実数関数
バリアント
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)