【问题标题】:Finding approximate square root of a number求一个数的近似平方根
【发布时间】:2014-09-06 04:53:28
【问题描述】:

这是我编写的代码,用于查找大约 平方根 一个非完美数(顺序为 0.0001 以及完美平方的精确平方根。它适用于非完美平方数但并不完美。当我输入 25 时,它给出 5.000068

#include<stdio.h>
int main()
{
    float a,i,count;
    scanf("%f",&a);

    for(count=1;(1);count=count+0.0001)
    {
        i=count*count;
        if (i<=a)
        break;
    }
    printf("%f",count);
    return 0;
}

【问题讨论】:

标签: c square-root


【解决方案1】:

你的计算平方根的方法是错误的。

你应该因为没有阅读有关square roots 的内容而得到一个不好的分数。了解问题是任何软件开发的第一步。

首先,您应该阅读The Floating Point Guide 和经典的每个程序员都应该知道的关于浮点运算的知识。它解释了为什么您的程序无法运行(即给出不准确的结果)。

然后,您的程序效率非常低(对于像数十亿这样的大输入数字,它需要大量的计算时间;对于像 0.01 这样的非常小的数字,它可能永远不会终止)。了解Newton-Raphson's method,也许可以通过阅读一些基本的数学书来了解。

请注意,许多 fixpoint 计算转换为迭代算法。

【讨论】:

    【解决方案2】:

    您的代码有两个问题:

    浮点数不精确。如果您想要更准确,请使用double,而不是float

    您的增量值太大。如果您增加较小的数量,您将(或应该)获得所需的值:请参见此处:http://ideone.com/7XM2IK

    下一个问题现在不会影响您的代码,但无论如何都要警告:

    不要将浮点运算用作循环计数器。要解决此问题,请将循环标准化以进行整数计数,并在循环内执行浮点:

    int count;
    float dCount = 1.0;
    float i, a;
    //...
    for (count=0; count < 100000; ++count)
    {
       //...
    }
    

    查看此链接:https://www.securecoding.cert.org/confluence/display/java/NUM09-J.+Do+not+use+floating-point+variables+as+loop+counters

    【讨论】:

    • 在这种情况下,问题不在于 for 循环,因为结束条件根本不使用浮点变量。您的代码将给出相同的结果 5.000068(OP 期望 5.0)
    • 是的,增量值太大(0.0001)。然而,这是一个非常幼稚的求平方根实现。
    • @BasileStarynkevitch 我累了。它显然不能解决输入
    【解决方案3】:

    如果你不想在书本和数学上挣扎:

    #include <stdio.h>
    #include <math.h>
    int main()
    {
      float n = 25;// ofc use scanf xD
    
      n=sqrt(n);
    
      printf("%.5f", n);
    
    
    return 0;
    }
    

    【讨论】:

    • 但也许练习是为了实现类似于sqrt的东西
    • 当然,但如果他不想更深入,这对他来说已经足够了:) 我完全同意你的看法! :)
    • 我真不知道他没有一点知识能从哪里毕业。 +没有人会雇用没有知识的人......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    • 2011-07-28
    • 2016-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多