浮点数开方运算的快速计算

浮点数开方的快速计算的代码是:

double fast2(double x)
{
    
    
        union P {
    
    
                double x;
                unsigned long i[2];
        };
        double a;
        union P x0;

        a = x/2;
        x0.x = x;
        x0.i[1] = ((x0.i[1] &(0xffefffff>>1))>>1)+(512<<20);
        x = x0.x/2 + a/x0.x;
        x = (x/2 + a/x);
        x = (x/2 + a/x);
        x = (x/2 + a/x);
        x = (x/2 + a/x);
        return x;
}

这里依然用到了牛顿迭代法。用了5次迭代。x0是初值。初值如何选取呢?由微积分课程可知,f(x)在x0的邻域内的近似值为
f(x0 +x) = f(x0) + f’(x0)*x
相应的,
sqrt(1 + x) = sqrt(1) + sqrt’(1) *x = 1 + 1/2 * x

那么,上面的移位就是取了这个值。因为浮点数的表示格式为
(s)(指数部分)(小数部分)

指数部分11位,中线是1024,1023代表0,因此移位之后还要加512,代表指数除2。小数部分52位,规格化数小数点前固定为1是不写的,所以移位的效果是对1的邻域内的x作了除2处理。最后得到 x0 = 1 +1/2 x,这就是初值。

初值是个近似值,小数低位部分的数值对计算影响忽略不计,因此没作处理。

猜你喜欢

转载自blog.csdn.net/aaasssdddd96/article/details/111861935