跳转到内容

C 编程/math.h

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

math.h 是 C 编程语言标准库中的一个头文件,用于基本数学运算。大多数函数涉及浮点数的使用。C++ 为了兼容性也实现了这些函数,并在头文件 cmath 中声明它们(C99 函数在当前 C++ 标准(C++ 98)中不可用)。

所有接受或返回角度的函数都以弧度为单位工作。

所有函数都接受 double 作为浮点参数,除非另有说明。在 C99 中,要使用 floatlong double,分别在名称后附加 fl

作用于整数的数学库函数,例如 abslabsdivldiv,在 stdlib.h 头文件中指定。

C99 之前的函数

[编辑 | 编辑源代码]
名称 描述
acos 反余弦
asin 反正弦
atan 单参数反正切
atan2 双参数反正切
ceil 向上取整,不小于参数的最小整数
cos 余弦
cosh 双曲余弦
cbrt 立方根
exp 指数函数
fabs 绝对值(浮点数)
floor 向下取整,不大于参数的最大整数
fmod 浮点余数: x - y*(int)(x/y)
frexp 将浮点数分解为尾数和指数
ldexp 将浮点数按指数缩放(参见文章)
log 自然对数
log10 以 10 为底的对数
modf(x,p) 返回 x 的小数部分,并将整数部分存储在指针 p 指向的位置
pow(x,y) x 乘以 y 次方,xy
sin 正弦
sinh 双曲正弦
sqrt 平方根
tan 正切
tanh 双曲正切]]

(要查找将字符串转换为浮点数的函数 (atof()、strtod() 等),请参见 C 编程/C 参考/stdlib.h)

(要查找将浮点数转换为字符串的函数 (snprintf()、itoa() 等),请参见 C 编程/C 参考/stdio.h 和 C_Programming/C_Reference/stdlib.h#itoa)

C99 函数

[编辑 | 编辑源代码]
名称 描述
acosh 反双曲余弦
asinh 反双曲正弦
atanh 反双曲正切
cbrt 立方根
copysign(x,y) 返回 x 的值,符号与 y 相同
erf 误差函数
erfc 互补误差函数
exp2(x) 将 2 乘以 x 次方,2x
expm1(x) x 的指数减 1,ex − 1
fdim(x,y) xy 之间的正差,fmax(xy, 0)
fma(x,y,z) 乘法并加法,(x * y) + z
fmax(x,y) xy 中的最大值
fmin(x,y) xy 中的最小值
hypot(x,y) 斜边,sqrt(x2 + y2)
ilogb 浮点值的指数,转换为 int
lgamma 伽马函数的绝对值的自然对数
llrint 四舍五入为整数(返回 long long),使用当前舍入模式
lrint 四舍五入为整数(返回 long),使用当前舍入模式
llround 四舍五入为整数(返回 long long
lround 四舍五入为整数(返回 long
log1p(x) 1 + x 的自然对数
log2 以 2 为底的对数
logb 从浮点数中提取指数
nan(s) 返回 NaN,可能使用字符串参数
nearbyint 将浮点数四舍五入为最接近的整数
nextafter(x,y) 返回 x 之后的可表示值(朝向 y
nexttoward(x,y) nextafter 相同,只是 y 始终是 long double
remainder(x,y) 计算余数,如 IEC 60559 要求的那样
remquo(x,y,p) remainder 相同,但将商(作为 int)存储在指针 p 的目标位置
rint 四舍五入为整数(返回 double),使用当前舍入模式
round 四舍五入为整数(返回 double),将中间值四舍五入为远离零的方向
scalbln(x,n) x * FLT_RADIXn (nlong)
scalbn(x,n) x * FLT_RADIXn (nint)
tgamma 伽马函数
trunc 截断浮点数

XSI 扩展

[编辑 | 编辑源代码]

额外的函数可能作为 X/Open 系统接口扩展提供。这些函数未出现在任何 ANSI 或 ISO C 标准中。

名称 描述
j0(x) x 的第一类零阶贝塞尔函数
j1(x) x 的第一类一阶贝塞尔函数
jn(n,x) x 的第一类 n 阶贝塞尔函数
scalb(x,y) x * FLT_RADIXy (xydouble)
y0(x) x 的第二类零阶贝塞尔函数
y1(x) x 的第二类一阶贝塞尔函数
yn(n,x) x 的第二类 n 阶贝塞尔函数

double 到字符串的转换函数 ecvtfcvtgcvt 已被弃用,建议使用 sprintf

数学常量 (非标准)

[编辑 | 编辑源代码]
名称 描述
M_E 自然对数的底。
M_LOG2E M_E 的以 2 为底的对数。
M_LOG10E M_E 的以 10 为底的对数。
M_LN2 2 的自然对数。
M_LN10 10 的自然对数。
M_PI 圆周率,圆的周长与其直径之比。
M_PI_2 圆周率除以二。
M_PI_4 圆周率除以四。
M_1_PI 圆周率的倒数 (1/pi)。
M_2_PI 圆周率的倒数的两倍。
M_2_SQRTPI 圆周率的平方根的倒数的两倍。
M_SQRT2 2 的平方根。
M_SQRT1_2 2 的平方根的倒数(也是 1/2 的平方根)。

所有值都是 double 类型。作为扩展,GNU C 库还定义了这些常量,类型为 long doublelong double 宏在其名称后附加了一个小写字母 ‘l’:M_El、M_PIl 等等。这些常量只有在定义了 _GNU_SOURCE 时才可用。

注意:一些程序使用名为 PI 的常量,其值与 M_PI 相同。此常量不是标准的;它可能出现在一些旧的 AT&T 头文件中,并且在 Stroustrup 的 C++ 著作中有所提及。它侵犯了用户的命名空间,因此 GNU C 库没有定义它。修复为期望此常量的程序很简单:将整个程序中的 PI 替换为 M_PI,或者在编译器命令行中添加 ‘-DPI=M_PI’。

虽然这些常量很常见,但它们不是 C 标准的一部分,因此大多数现代编译器需要显式定义(例如,Microsoft Visual C++ 中的 _USE_MATH_DEFINES[1])才能在包含 math.h 时定义它们。

[编辑 | 编辑源代码]

参考文献

[编辑 | 编辑源代码]
  1. 数学常量,MSDN。
华夏公益教科书