使用C中的梯形法则对某些值给出错误答案进行集成

时间:2015-02-24 18:27:48

标签: c

我写了一些代码来整合函数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

3 个答案:

答案 0 :(得分:2)

问题是在内循环的退出条件下,比较两个浮点数。在numberOfStrips次迭代后,由于浮点精度,它无法保证z == bz < bz > 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)。