鸟语天空
通用类型数学:tgmath.h(C99)
post by:追风剑情 2020-5-19 9:25
通用类型数学:tgmath.h(C99)
math.h和complex.h库中有许多类型不同但功能相似的函数。例如,下面6个都是计算正弦的函数:
double sin(double);
float sinf(float);
long double sinl(long double);
double complex csin(double complex);
float csinf(float complex);
long double csinl(long double complex);
tgmath.h头文件定义了展开为通用调用的宏,即根据指定的参数类型调用合适的函数。下面的代码演示了使用sin()宏时,展开为正弦函数的不同形式:
#include <tgmath.h>
...
double dx, dy;
float fx, fy;
long double complex clx, cly;
dy = sin(dx);  //展开为dy=sin(dx)
fy = sin(fx);  //展开为fy=sinf(fx)
cly = sin(clx);//展开为cly=csinl(clyx)
tgmath.h头文件为3类函数定义了通用宏。第1类由math.h和complex.h中定义的6个函数的变式组成,用l和f后缀和c前缀,如前面的sin()函数所示。在这种情况下,通用宏名与该函数double类型版本的函数名相同。
第2类由math.h头文件中定义的3个函数变式组成,使用l和f后缀,没有对应的复数函数(如,erf()),在这种情况下,宏名与没有后缀的函数名相同,如erf()。使用带复参数的这种宏的效果是未定义的。
第3类由complex.h头文件中定义的3个函数变式组成,使用l和f后缀,没有对应的实数函数,如cimag()。使用带实数参数的这种宏的效果是未定义的。
通用数学函数
acos asin atanb acosh asinh atanh
cos sin tan cosh sinh tanh
exp log pow sqrt fabs atan2
cbrt ceil copysign erf erfc exp2
expml fdim floor fma fmax fmin
fmod frexp hypot ilogb ldexp lgamma
llrint llround log10 loglp log2 logb
lrint lround nearbyint nextafter nexttoward remainder
remquo rint round scalbn scalbln tgamma
trunc carg cimag conj cproj creal
在C11以前,编写实现必须依赖扩展标准才能实现通用宏。但是使用C11新增的_Generic表达式可以直接实现。
评论:
发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容