当前位置: C语言 -- 标准库 -- <tgmath.h>

<tgmath.h>头文件(二)

对于<math.h>头文件中没有后缀的函数(modf函数除外。),如果<complex.h>头文件中没有同名函数(存在字母前缀c。),对应的泛型宏与函数同名。

上述函数与泛型宏的对应关系如下表所示:

泛型宏 <math.h>头文件中函数
float double long double
atan2 atan2f atan2 atan2l
cbrt cbrtf cbrt cbrtl
ceil ceilf ceil ceill
copysign copysignf copysign copysignl
erf erff erf erfl
erfc erfcf erfc erfcl
exp2 exp2f exp2 exp2l
expm1 expm1f expm1 expm1l
fdim fdimf fdim fdiml
floor 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
lgamma lgammaf lgamma lgammal
llrint llrintf llrint llrintl
llround llroundf llround llroundl
log10 log10f log10 log10l
log1p log1pf log1p log1pl
log2 log2f log2 log2l
logb logbf logb logbl
lrint lrintf lrint lrintl
lround lroundf lround lroundl
nearbyint nearbyintf nearbyint nearbyintl
nextafter nextafterf nextafter nextafterl
nexttoward nexttowardf nexttoward nexttowardl
remainder remainderf remainder remainderl
remquo remquof remquo remquol
rint rintf rint rintl
round roundf round roundl
scalbln scalblnf scalbln scalblnl
scalbn scalbnf scalbn scalbnl
tgamma tgammaf tgamma tgammal
trunc truncf trunc truncl

如果上述泛型宏中所有参数都是实数,使用宏将调用实数函数;否则使用上述泛型宏将导致未定义行为。


以泛型宏ceil为例:

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
/*宏ceil范例*/

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

int main(void)
{
    /*调用<math.h>头文件中的ceil函数。*/
    printf("ceil(1.3) = %.2f\n", ceil(1.3));

    /*调用<math.h>头文件中的ceilf函数。*/
    printf("ceil(1.3f) = %.2f\n", ceil(1.3f));

    /*调用<math.h>头文件中的ceill函数。*/
    printf("ceil(1.3L) = %.2Lf\n", ceil(1.3L));
 
    return 0;
}


输出:

ceil(1.3) = 2.00

ceil(1.3f) = 2.00

ceil(1.3L) = 2.00


对于<complex.h>头文件中没有后缀的函数,如果<math.h>头文件中没有同名函数(仅在字母前缀c上存在差异。),对应的泛型宏与函数同名。

上述函数与泛型宏的对应关系如下表所示:

泛型宏 <complex.h>头文件中函数
float double long double
carg cargf carg cargl
cimag cimagf cimag cimagl
conj conjf conj conjl
cproj cprojf cproj cprojl
creal crealf creal creall

上述泛型宏中的参数无论是实数还是复数,都将调用复数函数。


以泛型宏conj为例:

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
/*宏conj范例*/

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

/*判断数据类型的宏。*/
#define TYPE(x) _Generic((x),  \
                         float complex:"float complex type",  \
                         double complex:"double complex type",  \
                         long double complex:"long double complex type",  \
                         default:"unknown type"  \
                         )

int main(void)
{
    /*调用<complex.h>头文件的conj函数。*/
    printf("conj(1.0): %s\n", TYPE(conj(1.0)));

    /*调用<complex.h>头文件的conj函数。*/
    printf("conj(1.0+1.0I): %s\n", TYPE(conj(1.0+1.0I)));
 
    return 0;
}


输出:

conj(1.0): double complex type

conj(1.0+1.0I): double complex type