数学库
C 标准库中和“数学”相关的能力,既包含 <math.h> / <complex.h> 这类“直接提供数学函数”的头文件,也包含 <fenv.h> 这样的“控制浮点运算环境”的头文件;此外,C23 还引入了 <stdbit.h> 与 <stdckdint.h>,分别提供位运算工具与带检查的整数算术。
注意
本章以 C 标准为准进行描述。对于 C23 才引入的内容(如 <stdbit.h>、<stdckdint.h>),如果你的实现尚未支持,请把它们当作“可选能力”。
C 语言中和数学相关的库函数分散在好几个头文件当中,包括:
math.hcomplex.hfenv.hfloat.hstdint.hstdckdint.hstdlib.h
其中,math.h 里有很多常见常用的数学函数;
complex.h 里有一些和复数相关的函数;
fenv.h 里有一些和浮点环境相关的函数;
本章目录
- 17.1
<math.h> - 17.2
<complex.h> - 17.3
<tgmath.h> - 17.4 随机数生成
- 17.5
<stdbit.h> - 17.6
<stdckdint.h> - 17.7
<fenv.h>
数值函数的错误语义
数学函数并不总是“给出一个正常数值然后结束”。遇到定义域越界、上溢或下溢时,返回值可能是 NaN、无穷大或受实现影响的边界值。阅读 <math.h> 接口时,除了关注函数签名,还要同时关注错误语义与浮点异常语义,这样调用点才能做出稳定判断。
类型路径要与精度目标一致
sinf / sin / sinl 属于同一函数族,但它们对应 float / double / long double 路径。若计算链路目标精度明确,就应在入口处固定函数族,避免在中间步骤来回发生隐式转换。把类型路径固定下来,结果可预测性会更高。
#include <math.h>
long double phase(long double x) {
return sinl(x) + cosl(x);
}2
3
4
5
运行结果:该代码块主要用于语法或结构说明,单独运行通常无终端输出。
把数学与随机、位运算分层阅读
本章同时包含传统数学函数、随机数、位运算与带检查整数算术。它们共享“数值处理”主题,但语义层次不同:<math.h>/<complex.h> 更偏连续数值计算,<stdbit.h>/<stdckdint.h> 更偏离散整数与边界安全。先按语义层次分开掌握,再在项目里组合,理解成本会更低。
习题
写一个程序:从标准输入读入一个 double(角度,单位为度),输出它对应的弧度值、sin、cos。
要求:
- 使用
<math.h>; - 保留 6 位小数输出;
- 不要假设输入一定成功(检查输入函数返回值)。