我写了一些代码来整合函数5x ^ 4 + 4x ^ 3 + 3x ^ 2 + 2x + 1.
#include<stdio.h>
#include<math.h>
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("%f\n", 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
答案 0 :(得分:2)
问题是在内循环的退出条件下,比较两个浮点数。在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;
}
答案 1 :(得分:0)
乍一看,这看起来是float
的精确和舍入问题。
因此,请将float
更改为double
。
例如,在我的机器上,当使用6.271982
时,我会10
获得float
的输入,而当使用5.021983
时,我得到double
。< / p>
此外,你应该在浮点比较中使用epsilon。
答案 2 :(得分:0)
放置线:
printf("%f, %d\n", z, z < b);
在for
循环内部将每次迭代打印z
值以及循环条件结果。最后一个输出是:
1.000000, 1
这表明我们已经达到了正确的限制,但仍在执行循环体。从字面上看,它正在考虑1.000 < 1.000
。使用浮点数时可能会发生这种情况,因此为了防止它,请考虑循环某个整数(例如numberOfXValues
)。