【学习笔记】牛顿迭代法求平方根倒数

本文介绍了如何使用牛顿迭代法在C语言中计算平方根的倒数,并详细解释了迭代过程的公式推导,包括函数构建和迭代公式来源。适合理解数值计算方法和C语言实践者阅读。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【学习笔记】牛顿迭代法求平方根倒数

简介

介绍使用牛顿迭代法求平方根倒数1x\frac{1}{\sqrt{x}}x1的C语言实现和公式的推导。

代码

float InvSqrt(float num)
{
        float x = 1/num;
        float xhalf = 0.5f * num;
        float error = 1e-5;
    
        while (fabs(1.0f - num * x * x) >= error)
        {
            x = x*(1.5f-(xhalf*x*x));
        }

        return x;
}

代码很简单,就是使用牛顿迭代法计算,然后判断是否达到想要的精度,达到精度后退出。

这里精度设置是0.00001,可以根据自己实际情况调整。

传进来的值num必须大于0。

可以加入一个判断防止传入的值小于等于0.

float InvSqrt(float num)
{
    if (num > 0)
    {
        float x = 1/num;
        float xhalf = 0.5f * num;
        float error = 1e-5;
    
        while (fabs(1.0f - num * x * x) >= error)
        {
            x = x*(1.5f-(xhalf*x*x));
        }

        return x;
    }
    else
    {
        return -1;
    }
}

公式推导

这里说明代码x = x*(1.5f-(xhalf*x*x));是如何得到的。

牛顿迭代法公式如下。

xn+1=xn−f(xn)f′(xn)x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}xn+1=xnf(xn)f(xn)

我们计算平方根倒数的公式:

y=1x=x−12y = \frac{1}{\sqrt{x}} = x^{-\frac 12}y=x1=x21

所以

1y2=x\frac{1}{{y}^2} = xy21=x

构建以y为自变量的函数方程为

f(y)=1y2−x=0f(y) = \frac{1}{{y}^2} - x = 0f(y)=y21x=0

=y−2−x=0= {{y}^{-2}} - x = 0=y2x=0

f′(y)=−2y−3=0f'(y) = {{-2}{y}^{-3}} = 0f(y)=2y3=0

f(y)f(y)f(y)f′(y)f'(y)f(y)带入

y−f(y)f′(y)=y−y−2−x−2y−3y - \frac{f(y)}{f'(y)} = y - \frac{{{y}^{-2}} - x}{{{-2}{y}^{-3}}}yf(y)f(y)=y2y3y2x

=y+y−xy32= y + \frac{{y} - xy^3}{2}=y+2yxy3

=32y−12xy3= \frac{3}{2}y - \frac{1}{2}xy^3=23y21xy3

所以

yn+1=32yn−12xyn3y_{n+1} = \frac{3}{2}{y_n} - \frac{1}{2}x{y_n}^3yn+1=23yn21xyn3 = 1.5yn−0.5xyn31.5{y_n} - 0.5x{y_n}^31.5yn0.5xyn3

上面代码x = x*(1.5f-(xhalf*x*x));就是这样得到。

实际计算,设x=2x = 2x=2y1=12=0.5y_1 = \frac{1}2 = 0.5y1=21=0.5

y2=1.5×0.5−0.5×2×0.53=0.625000y_2 = 1.5×{0.5} - 0.5×2×{0.5^3} = 0.625000y2=1.5×0.50.5×2×0.53=0.625000

y3=1.5×0.625−0.5×2×0.6253=0.693359y_3 = 1.5×{0.625} - 0.5×2×{0.625^3} = 0.693359y3=1.5×0.6250.5×2×0.6253=0.693359

y4=1.5×0.693359−0.5×2×0.6933593=0.706708y_4 = 1.5×{0.693359} - 0.5×2×{0.693359^3} = 0.706708y4=1.5×0.6933590.5×2×0.6933593=0.706708

y5=1.5×0.706708−0.5×2×0.7067083=0.707106y_5 = 1.5×{0.706708} - 0.5×2×{0.706708^3} = 0.707106y5=1.5×0.7067080.5×2×0.7067083=0.707106

这里经过4次迭代,就得到了12\frac{1}{\sqrt{2}}21的值。


本文链接:https://blog.youkuaiyun.com/u012028275/article/details/113791370

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值