用迭代法求某数a的平方根

今天晚上笔试题目最后一题很简单,可是自己做不出= =,就是不用库函数,求一个浮点数的平方根。

立马想到用物理法,比如正方形的面积法等,可是求解出不出,然后就绕在里面了。归根到底还是平时的知识储备太少了,笔试完,上网一查才知道原来有特定的方法求平方根的大哭

迭代法求平方根


已知求平方根的迭代公式为:x n+1 = (xn + a / xn) / 2
要求前后两次求出的差的绝对值小于10-5


算法如下:

① 设定一个x的初值x0 ; (在如下程序中取x0=a/2, 通过迭代公式求出x1,可以肯定与真正的平方根相比,误差很大。)
② 用上述公式求出x的下一个值 x1 ;
③ 如此继续下去,直到前后两次求出的x值(x n+1和xn)满足以下关系:|x n+1-xn|<10-
#include <stdio.h>
#include <math.h>
int   main()
{
    float a;     
    float x0, x1;
    printf("Input a positive number:\n");
    scanf("%f", &a);
    x0 = a / 2;  
    x1 = (x0 + a / x0) / 2;
    while (fabs(x1 - x0) >= 1e-5)
    {
        x0 = x1;
        x1 = (x0 + a / x0) / 2;
    }
    printf("The square root of %5.2f is %8.5f\n", a, x1);
    return 0;
}

运行结果:
=====================================
Input a positive number:
2↙
The square root of  2.00 is  1.41421
=====================================

 其中初值是任取的(这里取的a/2) , 试将x0初值换为任意数均可得到如上结果。只是迭代的次数有差异。

 另外,考虑到while与do-while的差别,此程序用while结构,那是否会出现第一次判断条件时就不成立呢,即不会执行循环体。验证如下:设被开方数a为4,x0 初值为2,则由迭代公式可得x1值为2,x1=x0 值应该为0, 此时应该不会执行循环体,那么结果是否还是正确的呢? 验证如下:

#include <stdio.h>
#include <math.h>
int   main()
{
    float a;
    float x0, x1;
    printf("Input a positive number:\n");
    scanf("%f", &a);
    x0 = 2;
    x1 = (x0 + a / x0) / 2;
    printf("x0=%f x1=%f x1-x0=%f\n", x0, x1, x1-x0);
    while (fabs(x1 - x0) >= 1e-5)
    {
        x0 = x1;  
        x1 = (x0 + a / x0) / 2;
        printf("x1=%f\n", x1); 
    }
    printf("The square root of %5.2f is %8.5f\n", a, x1);
    return 0;
}

运行结果: (没有输出循环体中的内容)
===============================================
Input a positive number:
4↙
x0=2.000000 x1=2.000000 x1-x0=0.000000
The square root of  4.00 is  2.00000
===============================================

 若被开方数 a 为9, 初值为3, 情况与以上类似, 都不满足条件, 没有进入循环体运行, 但结果都是正确的。原因(我猜)是在做如上假设时, x1经一次迭代后已经就是正确的结果了, 而不需要再做第二次迭代,那么是否执行循环体也就无所谓了。这应该和这种迭代方法的由来有点关系,我猜。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值