我正在编写一个程序,使用C中的Newton-Raphson方法找到给定整数n的平方根的近似值.我使用了以下公式:
这是我的代码:
#include <stdio.h>
double newton_raphson(int n, int iter);
double newton_raphson(int n, int iter)
{
if(iter == 0) // base case
return 1;
else // iterative case
return (1/2*(newton_raphson(n, iter-1) + n/(newton_raphson(n, iter-1))));
}
int main()
{
int n;
int i;
printf("Enter a number you want to know the square root of:\n");
fflush(stdout);
scanf("%d", &n);
printf("Enter number of iterations to be worked out:\n");
fflush(stdout);
scanf("%d", &i);
printf("%.3f", newton_raphson(n,i-1));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我输入2和3时,预期的输出是1.417(3次迭代后2的平方根)我得到错误-1.#IO.例如,当我输入5和2时,我得到0.000.我调试了它,但仍然无法弄清楚问题是什么.任何帮助是极大的赞赏.
编辑:详细说明输出
您的问题似乎是您错误处理浮点运算.
newton_raphson函数的第一个参数应该是a double,特别是因为你似乎是递归地调用它.就像现在一样,您只需将一次迭代的结果转换为整数并将其传递给下一次迭代.
1 / 2使用整数运算.那应该是0.5或者1.0 / 2.0相反.注意,在整数运算中,1 / 2是0.你看到的错误是因为你将它传递0给下一个迭代,然后它除以0.
#include <stdio.h>
double newton_raphson(double n, int iter);
double newton_raphson(double n, int iter)
{
if (iter == 0) {
return 1;
}
else {
return 0.5 * (newton_raphson(n, iter - 1) + n/(newton_raphson(n, iter - 1)));
}
}
int main()
{
int n;
int i;
printf("Enter a number you want to know the square root of:\n");
fflush(stdout);
scanf("%d", &n);
printf("Enter number of iterations to be worked out:\n");
fflush(stdout);
scanf("%d", &i);
printf("%.3f\n", newton_raphson(n, i - 1));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
正如其他人在评论中指出的那样,您可以提高此实施效率.
首先,您可以通过将结果保存在变量中来消除函数调用.由于这是一个递归函数,如果你有很多迭代,这将节省大量的执行时间.
double newton_raphson(double n, int iter)
{
if (iter == 0) {
return 1;
}
else {
double xk = newton_raphson(n, iter - 1);
return 0.5 * (xk + n / xk);
}
}
Run Code Online (Sandbox Code Playgroud)
然后,你可以完全消除递归.如果您运行多次迭代,这将使您的程序消耗更少的内存,因为您摆脱了不必要的堆栈操作.
double newton_raphson(double n, int iter)
{
int k;
double xk = 1;
for (k = 0; k < iter; k++) {
xk = 0.5 * (xk + n / xk);
}
return xk;
}
Run Code Online (Sandbox Code Playgroud)
对于迭代计数,您应该使用unsigned int(或简单地unsigned)代替int.运行负数的迭代是没有意义的,例如.你不能运行-5迭代......所以你不需要有符号整数.
#include <stdio.h>
double newton_raphson(double n, unsigned iter);
double newton_raphson(double n, unsigned iter)
{
unsigned k;
double xk = 1;
for (k = 0; k < iter; k++) {
xk = 0.5 * (xk + n / xk);
}
return xk;
}
int main()
{
int n;
unsigned i;
printf("Enter a number you want to know the square root of:\n");
fflush(stdout);
scanf("%d", &n);
printf("Enter number of iterations to be worked out:\n");
fflush(stdout);
scanf("%u", &i);
printf("%.3f\n", newton_raphson(n, i - 1));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
更多的东西:
| 归档时间: |
|
| 查看次数: |
717 次 |
| 最近记录: |