C++实现数学公式计算结果与计算器输出不一致该如何解决
C++代码计算结果与计算器不符的问题排查
以下是你代码中存在的明确问题:
- 宏定义拼写错误,位置不符合要求
你定义的#define _USE_MATH_DEF是错误的,正确的宏名为_USE_MATH_DEFINES,且该宏必须在包含<cmath>之前定义,才能让<cmath>导出高精度的数学常量,比如自然对数底M_E。 - 手动定义的e精度严重不足
你手动写的const double e = 2.71和真实的自然对数底(约2.718281828459045)偏差较大,直接带来了接近0.3%的误差,还会放大后续计算的偏差,不需要手动定义e,直接使用<cmath>提供的M_E即可。 - 公式实现逻辑疑似错误
按你当前的代码逻辑,输入x=1、a=4、b=5、c=1得到的结果确实是约-4.49,和你给出的计算器结果-0.95差距极大,大概率是你对公式的幂次理解有误:
如果你要实现的是*(x+a)的三次根号*(而非三次方开根号),需要把pow(sqrt(x + a), 3)替换为cbrt(x + a)(C++11及以上支持)或者pow(x + a, 1.0/3),替换后计算结果会和你给出的计算器结果非常接近。 - 浮点计算精度优化
你写的pow(sqrt(x + a), 3)等价于pow(x + a, 1.5),直接写后者可以减少一次浮点运算,计算精度更高。
修正后的参考代码
#define _USE_MATH_DEFINES #include <iostream> #include <conio.h> #include <cmath> using namespace std; int main() { double x, a, b, c, A, B, C, M; cout << "Enter the value of x, a, b and c: "; cin >> x >> a >> b >> c; // 如果你要的是(x+a)的3/2次方,保留下面这行 A = x + pow(x + a, 1.5); // 如果你要的是(x+a)的三次根号,替换为下面这行 // A = x + cbrt(x + a); B = x - sqrt(abs(x - b)); C = A / B; M = pow(M_E, -1 * c) * C; cout << "The result of function is " << M; _getch(); return 0; }
内容的提问来源于stack exchange,提问作者arcend
相关产品推荐
相关产品推荐

