我正试图在我的程序中求解这个公式:
=10^(-1*(107.8871+0.03252849*297-5151.79/297-38.92561*log(297)+563713.9/297^2))
最后我应该得到的正确答案是4.58E-11
,不幸的是,这不是我得到的,这就是我编程的方式:
int X19 = pow(10, (-1*(107.8871+0.03252849*297-5151.79/297-38.92561* log(297)+563713.9/pow(297, 2))));
但当我运行程序时得到的答案是:-2147483648
我做错了什么?
EDIT=在代表我更改了明显的错误,将的类型更改为double
而不是int
之后,我的新答案现在是=10948824009217039033385554100376102490822180576034479094375076006115616972742335036083272081670698970658879817383936.000000
,这仍然不是我的答案,任何其他
log
例程是一个自然对数,以e为底,但您需要以10为底的log10
。
int
s只能是整数。4.58E-11
是0.0000000000458
,所以应该使用浮点或定点十进制数据类型。如果您可以接受舍入错误的可能性(无论如何,浮点文字都可能会出现这种情况),那么您可以简单地使用double
数据类型而不是int
。
然而,这并没有考虑溢出的可能性或数据存储限制的其他问题。请注意,当格式更改为双精度时,结果仍然不是您想要的:http://ideone.com/PMoyJA(我明白了,你已经注意到了。)然而,这似乎不是数据类型的问题,而是你的等式的问题;我敢肯定你的运算顺序是错误的,或者你的方程在其他方面是错误的。使用以下任务:
double x8 = 0.03252849 * 297; // 9.660962
double x9 = 107.8871 + x8; // 117.548062
double x10 = 5151.79 / 297; // 17.346094
double x11 = x9 - x10; // 100.201967
double x12 = log(297); // 5.693732
double x13 = 38.92561 * x12; // 221.631997
double x14 = x11 - x13; // -121.430029
double x15 = pow(297, 2); // 88209.000000
double x16 = 563713.9 / x15; // 6.390662
double x17 = -(x14 + x16); // 115.039367
double x18 = pow(10, x17); // 10948824009217039033385554100376102490822180576034479094375076006115616972742335036083272081670698970658879817383936.000000
- 若要使
x18
为4.58E-11
,则x17
必须等于-23.80673702480841
,而不是115.039367
- 作为
x17 = -(x14 + x16)
,这意味着x14 == -x17 - x16 == 23.80673702480841-563713.9/pow(297, 2) == 17.4160750742138
,而不是-121.430029
- 作为
x14 = x11 -x13 == x11 - 38.92561*log(297)
,这意味着x11 == 17.4160750742138 + 38.92561*log(297) == 239.04807175371357
,而不是100.201967
x11 = x9 - x10
->x9 == x11 + 5151.79 / 297 == 239.04807175371357 + 5151.79 / 297 == 256.3941660298078
,而非117.548062
x9 = 107.8871 + x8
->x8 == x9 - 107.8871 == 256.3941660298078 - 107.8871 == 148.50706602980782
,而不是9.660962