为什么我的 C 程序一直给我 1 作为错误?
Why does my C program keep giving me 1 as the error?
我 运行 它,一切似乎都很好——除了它总是给我 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;
}
}
abs()
处理 int
并将 return 和 int
,你需要 fabsf()
.
同理,pow()
是给double
的,你应该用powf()
.
另一个错误是写 1/3
并期望结果为 0.333...。 1
和 3
是 int
字面量,所以执行的操作是整数除法。您需要使用 float
文字,例如 1.0f/3.0f
.
这就是类型兼容性。但是我可以看到另一个错误:您希望 e
以某种方式记住它的公式并自动重新应用它。这不是命令式语言的工作方式:当您编写 e = something
时,"something" 会被计算并一劳永逸地存储在 e
中。您为 a
正确地执行了此操作,现在只需将 e=abs(...);
放入 while
循环中以每次更新它。
我 运行 它,一切似乎都很好——除了它总是给我 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;
}
}
abs()
处理 int
并将 return 和 int
,你需要 fabsf()
.
同理,pow()
是给double
的,你应该用powf()
.
另一个错误是写 1/3
并期望结果为 0.333...。 1
和 3
是 int
字面量,所以执行的操作是整数除法。您需要使用 float
文字,例如 1.0f/3.0f
.
这就是类型兼容性。但是我可以看到另一个错误:您希望 e
以某种方式记住它的公式并自动重新应用它。这不是命令式语言的工作方式:当您编写 e = something
时,"something" 会被计算并一劳永逸地存储在 e
中。您为 a
正确地执行了此操作,现在只需将 e=abs(...);
放入 while
循环中以每次更新它。