我写了一些代码来集成函数5x ^ 4 + 4x ^ 3 + 3x ^ 2 + 2x + 1。
#include #include float func(float x){ float a; a = 5*pow(x,4) + 4*pow(x,3) + 3*pow(x,2) + 2*x +1; return a; } int main(){ float numberOfXValues; float a = 0; //lower limit float b = 1; //upper limit float numberOfStrips; float stripSize; float finalAnswer; float sumFirstAndLast; //summation of first and last x value while(1){ printf("Input number of X values:"); scanf("%f", &numberOfXValues); numberOfStrips = numberOfXValues - 1; stripSize = (b - a)/(numberOfStrips); sumFirstAndLast = 0.5*func(a) + 0.5*func(b); for (float z = stripSize; z < b; z += stripSize ){ sumFirstAndLast += func(z); } finalAnswer = sumFirstAndLast * stripSize; printf("%fn", finalAnswer); } return 0; }
它适用于大多数值,但13和20的输出给出了错误的答案。 我已经仔细研究了几次,但看不出是什么原因引起的。
Input number of X values:10 5.039070 Input number of X values:11 5.031651 Input number of X values:12 5.026160 Input number of X values:13 6.271982 Input number of X values:14 5.018732 Input number of X values:15 5.016153 Input number of X values:16 5.014071 Input number of X values:17 5.012367 Input number of X values:18 5.010955 Input number of X values:19 5.009773 Input number of X values:20 5.798243 Input number of X values:21 5.007917
问题是在内循环的退出条件下,比较两个浮点数。 在numberOfStrips
迭代之后,由于浮点精度,不能保证z == b
。 z < b
或z > b
完全有可能。 在z < b
情况下,循环它再次执行。
你应该使numberOfStrips
成为一个整数并重写这样的循环:
float z = stripSize; for (int i = 1; i < numberOfStrips; i++) { sumFirstAndLast += func(z); z += stripSize; }
乍一看,这看起来精确和圆形的float
问题。 因此将float
改为double
。
例如,在我的机器上,当使用float
时,输入为10
,得到5.021983
,而当使用double
时,得到5.021983
。
此外,您应该在浮点比较中使用epsilon。
放置线:
printf("%f, %dn", z, z < b);
在for
循环内部将每次迭代打印z
值以及循环条件结果。 最后一个输出是:
1.000000, 1
这表明我们已经达到了正确的限制,但仍在执行循环体。 从字面上看,它认为1.000 < 1.000
。 使用浮点数时可能会发生这种情况,因此为了防止它,请考虑循环某个整数(例如numberOfXValues
)。
以上就是c/c++开发分享使用C中的梯形法则对某些值给出错误答案进行集成相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/522825.html