正确写法需先校验三边为正且满足严格三角形不等式,再计算半周长s,对s-a、s-b、s-c取max(0.0,·)避免浮点负值,最后用std::sqrt求面积,头文件必须包含。

用海伦公式计算三角形面积的正确写法
只要三边满足三角形不等式(任意两边之和大于第三边),sqrt(s*(s-a)*(s-b)*(s-c)) 就能算出面积。但直接套公式容易因浮点精度或非法输入崩溃,必须加校验。
- 先检查
a > 0 && b > 0 && c > 0,负数或零边长无意义 - 再验证是否构成三角形:
a + b > c && a + c > b && b + c > a(注意用严格大于,等于时面积为 0,但通常视为退化三角形) -
s必须是半周长:double s = (a + b + c) / 2.0;,别漏除以 2 或写成整数除法 - 计算前确保
s - a、s - b、s - c全 ≥ 0,否则sqrt会返回NaN
std::sqrt 和头文件依赖不能省
不包含 就调用 sqrt,多数编译器会报 undefined reference to sqrt;用 std::sqrt 还得确认没遗漏 using std::sqrt 或作用域限定。
- C++ 中必须写
#include,是 C 风格,不保证在全局命名空间导出函数 - 推荐显式写
std::sqrt(...),避免与自定义sqrt冲突 - 若传入负数,
std::sqrt返回NaN,后续输出可能变成-nan或inf,不易排查
处理浮点误差导致的负值陷阱
当三边非常接近退化状态(比如 a=1e9, b=1e9, c=1.999999999e9),s - c 可能因浮点舍入变成微小负数(如 -1e-12),此时 sqrt 直接失效。
- 安全做法:计算前对三项取
std::max(0.0, s - a)等,强制非负 - 更稳妥:先算
double area_sq = s * (s - a) * (s - b) * (s - c);,再判断area_sq - 不要用
abs()包裹整个乘积——负号可能来自奇数个负因子,不代表面积为 0
#include#include #include double triangleArea(double a, double b, double c) { if (a <= 0 || b <= 0 || c <= 0) return -1.0; if (a + b <= c || a + c <= b || b + c <= a) return 0.0; double s = (a + b + c) / 2.0; double area_sq = s (s - a) (s - b) * (s - c); return (area_sq < 0) ? 0.0 : std::sqrt(area_sq); }
int main() { double a = 3, b = 4, c = 5; std::cout << std::fixed << std::setprecision(2); std::cout << "Area: " << triangleArea(a, b, c) << "\n"; // 输出 6.00 }
实际用的时候,最常被忽略的是退化三角形的判定边界(用 而不是 )和浮点下溢后的负值截断——这两个点不处理,线上跑着跑着就冒出 nan。
立即学习“C++免费学习笔记(深入)”;











