
cos 函数在 C++ 里怎么用
直接调用 std::cos,它接受弧度制参数,返回 double 类型的余弦值。别传角度,也别忘了包含头文件。
-
#include <cmath></cmath>是必须的,<math.h></math.h>虽然能用,但 C++ 推荐前者 - 输入必须是弧度:比如求 60° 的余弦,得写
std::cos(60 * M_PI / 180),不是std::cos(60) - 传
float或long double会触发重载,对应cosf和cosl,但日常用std::cos(即double版)最稳妥 - 输入值极大时(如
1e20),由于浮点精度丢失,结果可能完全不可信——这不是函数 bug,是弧度归约失效的共性问题
sin 和 cos 的常见错误现象
程序跑出来结果明显不对,大概率栽在这几个地方:
- 忘记转弧度:
std::cos(90)算的是 90 弧度(≈5156°)的余弦,不是 90°,结果是-0.448...,而非预期的 0 - 用了未定义的宏:
M_PI在某些编译器(如 MSVC 默认、部分 Linux 环境)不启用,直接编译失败或值为 0;解决办法是加#define _USE_MATH_DEFINES(Windows)或#define _GNU_SOURCE(glibc),或干脆自己写constexpr double PI = 3.14159265358979323846; - 传了整数却没注意隐式转换:虽然
std::cos(0)能过,但这是靠 int→double 自动提升,别依赖它写cos(180/180)这种——整数除法得 1,不是 1.0
性能与精度要注意什么
std::cos 和 std::sin 是 libc 实现的数学函数,通常基于硬件指令(如 x86 的 FCOS)或高质量多项式逼近,速度够用,但有几点实际影响:
- 对大量数据批量计算时,单次调用开销不大,但反复调用不如查表+插值快(尤其嵌入式或实时图形场景)
- 输入值接近 π/2 的奇数倍时(如
1.57079632679),结果可能因浮点舍入误差出现微小偏差(如本该是 0,算出 1e-16),做等值判断时别写if (cos(x) == 0),改用std::abs(cos(x)) - 如果只处理小范围角度(比如 -π/4 到 π/4),可考虑泰勒展开截断加速,但通用代码中没必要——标准库已足够优化
一个能直接跑的最小示例
下面这段代码在主流编译器(GCC/Clang/MSVC)下都能编译运行,输出 60° 的余弦值:
立即学习“C++免费学习笔记(深入)”;
#include <iostream>
#include <cmath>
<h1>ifndef M_PI</h1><h1>define M_PI 3.14159265358979323846</h1><h1>endif</h1><p>int main() {
double angle_deg = 60.0;
double angle_rad = angle_deg * M_PI / 180.0;
std::cout << "cos(" << angle_deg << "°) = " << std::cos(angle_rad) << "\n";
return 0;
}</p>输出是 cos(60°) = 0.5。注意 M_PI 的兜底定义,避免跨平台编译失败。
真正容易被忽略的,是弧度制这个前提——它不写在函数签名里,也不报错,只是默默给你算一个你根本没想到的角度。










