跳转至内容

C 编程/tgmath.h

来自维基教科书,开放世界中的开放书籍

tgmath.h 是一个 标准 C 头文件,它定义了许多类型泛型 ,可用于各种数学运算。该头文件还包含 math.hcomplex.h。对于 math.hcomplex.h 头文件中的所有没有 f (float) 或 l (long double) 后缀的函数,以及其对应类型为 double(modf() 除外)的函数,都有一个相应的宏。 [1]

类型泛型宏

[编辑 | 编辑源代码]

类型泛型宏是一种允许调用函数的机制,该函数的类型由宏中参数的类型决定。这意味着,例如,x 被声明为 int 数据类型,但 被这样调用

 tan((float)x)


那么这个表达式将具有类型 float [2]
此外,如果类型泛型宏的任何一个参数或自变量是复数,它将调用复数函数,否则将调用实数函数。最终调用的函数类型取决于参数的最终转换类型。 [3]

依赖图

[编辑 | 编辑源代码]

下面的流程图显示了 tgmath.h 的依赖图。 [4]

依赖图

来自 math.h 的函数

[编辑 | 编辑源代码]

下面列出的函数仅处理实数参数并返回实数输出。如果传递复数参数给这些函数,将返回 NaN 或其他特殊数字。 [5]

名称 描述
acos 反余弦
asin 反正弦
atan 单参数反正切
atan2 双参数反正切
ceil 向上取整,不小于参数的最小整数
cos 余弦
cosh 双曲余弦
exp 指数函数
fabs 浮点数的绝对值
floor 向下取整,不大于参数的最大整数
fmod 浮点余数
frexp 将数字分解为有效数字和 2 的幂
ldexp 根据指数缩放浮点数(见文章)
log 自然对数
log10 以 10 为底的对数
modf(x,p) 返回x 的小数部分,并将整数部分存储在指针p 指向的位置
pow(x,y) x 乘方yxy
sin 正弦
sinh 双曲正弦
sqrt 平方根,返回数字的非负平方根
tan 正切
tanh 双曲正切
isgreater 如果 x > y,则返回 1,否则返回 0
isnan(x) 如果 x 是 NaN(非数字),则返回 1
islessequal 如果 x 小于或等于 y,则返回 1,否则返回 0
isinf(x) 表示 x 是否为无穷大
signbit 表示 x 是否为负数(如果 x 小于 0,则返回 8,否则返回 0)

来自 complex.h 的函数

[编辑 | 编辑源代码]

下面定义的函数处理复数参数,但不返回复数输出。 [5]

名称 描述
cacos 反余弦
casin 反正弦
catan 单参数反正切
catan2 双参数反正切
cceil 向上取整,不小于参数的最小整数
ccos 余弦
ccosh 双曲余弦
cexp 指数函数
cabs 复数浮点数的绝对值
cfloor 向下取整,不大于参数的最大整数
cfmod 浮点余数
cfrexp 将数字分解为有效数字和 2 的幂
cldexp 根据指数缩放浮点数(见文章)
clog 自然对数
clog10 以 10 为底的对数
cmodf(x,p) 返回x 的小数部分,并将整数部分存储在指针p 指向的位置
cpow(x,y) x 乘方yxy
csin 正弦
csinh 双曲正弦
csqrt 平方根,返回数字的非负平方根
ctan 正切
ctanh 双曲正切

使用示例

[编辑 | 编辑源代码]

以下代码说明了 tgmath.h 中定义的 atan 函数的使用,该函数计算正切函数域中定义的数字的反正切。

#include <stdio.h>
#include <tgmath.h>
int main()
{
        float ang, ans;
        scanf("%f", &ang);
        ans = atan(ang);
        printf("%0.3f\n", ans);
        return 0;
}

显著差异

[编辑 | 编辑源代码]

这里定义的类似函数在“棘手”数字的返回值方面存在显著差异。例如,使用 sqrt 计算 -25 的平方根返回 -NaN(非数字),而 csqrt 返回 0.000000。在其他函数中也可能注意到此类差异。

基本原理

[编辑 | 编辑源代码]

此头文件主要在计算数学函数时包含。由于它包含了 math.hcomplex.h,因此解决了由不一致输入引起的错误。单独包含任何头文件都会导致某些输入的不一致输出。

参考文献

[编辑 | 编辑源代码]
  1. http://www.opengroup.org/onlinepubs/009695399/basedefs/tgmath.h.html
  2. http://manpages.ubuntu.com/manpages/hardy/man7/tgmath.h.7posix.html
  3. http://www.qnx.com/developers/docs/6.4.1/dinkum_en/c99/tgmath.html
  4. http://www-zeuthen.desy.de/apewww/APE/software/nlibc/html/tgmath_8h.html
  5. a b http://pubs.opengroup.org/onlinepubs/009604599/basedefs/tgmath.h.html
[编辑 | 编辑源代码]
华夏公益教科书