我设法让我的sqrt函数运行得很好,但是我猜第二次猜测是否根据我给出的伪代码正确编写了这段代码。
这是伪代码:
x = 1
repeat 10 times: x = (x + n / x) / 2
return x.
我写的代码,
#include <iostream>
#include <math.h>
using namespace std;
double my_sqrt_1(double n)
{
double x= 1; x<10; ++x;
return (x+n/x)/2;
}
答案 0 :(得分:7)
不,您的代码不遵循您的伪代码。例如,您不会在代码中重复任何内容。您需要添加一个循环来执行此操作:
#include <iostream>
#include <math.h>
using namespace std;
double my_sqrt_1(double n)
{
double x = 1;
for(int i = 0; i < 10; ++i) // repeat 10 times
x = (x+n/x)/2;
return x;
}
让我们分析您的代码:
double x = 1;
// Ok, x set to 1
x < 10;
// This is true, as 1 is less than 10, but it is not used anywhere
++x;
// Increment x - now x == 2
return (x + n / x) / 2
// return value is always (2 + n / 2) / 2
由于您没有任何循环,函数将始终在第一个“迭代”中退出,返回值为(2 + n / 2) / 2
。
答案 1 :(得分:3)
正如另一种可以使用二进制搜索或另一种非常优雅的解决方案的方法是使用牛顿方法。
Newton的方法是一种查找函数根的方法,利用函数的导数。在每个步骤中,值的计算公式为:x(step) = x(step-1) - f(x(step-1))/f'(x(step-1))
Newton's_method
这可能比二进制搜索更快。我在C ++中的实现:
double NewtonMethod(double x) {
double eps = 0.0001; //the precision
double x0 = 10;
while( fabs(x-x0) > eps) {
double a = x0*x0-n;
double r = a/(2*x0);
x = x0 - r;
x0 = x;
}
return x;
}
答案 2 :(得分:1)
由于人们正在展示计算平方根的不同方法,我无法抗拒;)......
以下是Quake III Arena
的反平方根实现的the exact copy (with the original comments, but without preprocessor directives):
float Q_rsqrt( float number )
{
long i;
float x2, y;
const float threehalfs = 1.5F;
x2 = number * 0.5F;
y = number;
i = * ( long * ) &y; // evil floating point bit level hacking
i = 0x5f3759df - ( i >> 1 ); // what the...?
y = * ( float * ) &i;
y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration
// y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed
return y;
}