为什么我的C程序继续给我一个错误?

时间:2015-01-31 20:33:06

标签: c debugging math

我跑了,一切似乎都很好 - 除了它一直给我一个误差范围1.为什么这样做?

该程序应该提示用户输入3的立方根的估计,并且它使用牛顿的近似方法来显示获得近似的尝试次数。在500次尝试或误差小于0.000001之后,它应该退出循环。但是,为什么没有误差的变化?

这是我的代码:

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

int main()
{
    float a, i, e;                       //declare float variables
    printf("Consider the function f(x) = x^3 - 3 = 0.\n");
    printf("Simplifying, we get x^3 = 3.\n");
    printf("Simplifying it further, we get x = 3^(1/3).\n");
    printf("Enter your estimate of the root: ");
    scanf("%f", &a);                    //prompt user to guestimate
    printf("So you're saying that x = %f.\n", a);
    i=0;                                //initiate attempt counter
    e=abs((a-pow(3, (1/3)))/pow(3, (1/3)));  //margin of error formula
    while (e>=0.000001 && i<=500)     //initiate while loop with above expressions
    {
        if (a!=pow(3, (1/3)))
        {
            printf("Attempt %f: ", i);
            a = a - (pow(a, 3) - 3)/(3*pow(a, 2));
            printf("%f, ", a);
            printf("%f margin of error\n", e);
            i=i+1;
        }
        else
            break;
    }
}

1 个答案:

答案 0 :(得分:4)

abs()处理int s并返回int,您需要fabsf()

同样,pow()适用于double,您应该使用powf()

另一个错误是写1/3并期待0.333 ......结果。 13int个文字,因此执行的操作是整数除法。您需要使用float文字,例如1.0f/3.0f

这就是类型兼容性。我可以看到另一个错误:你希望e以某种方式记住它的公式并自动重新应用它。这不是命令式语言的工作方式:当您编写e = something时,“某事物”会一劳永逸地计算并存储在e中。您正在为a正确地执行此操作,现在只需将e=abs(...);置于while循环中以便每次都更新它。