为什么这个计算 sqrt 的 C 函数不能计算小数?

Why isn't this C funtion calculating sqrt working for decimals?

#include <iostream>

float calculating_root(float N, float root_N, float increment)
{
    int safety=1;
    while(safety==1)
    {
        if (N == (root_N*root_N))
        {
            safety=0;
            return root_N;  
        }
        else if(N<((root_N+increment)*(root_N+increment)))
        {
            safety=0;
            return calculating_root(N,root_N, increment*0.1);
        }
        root_N=root_N+increment;
    }
}

int main()
{
    float N, root_N=0.0, increment=1000.0;

    scanf("%f",&N);

    float x = calculating_root(N, root_N, increment);

    printf("\n%g\n",x);

    return 0;
}

想了这么久。我想我没有其他想法,一切似乎都很完美?有人看错了吗?

不建议使用 == 来比较您计算的浮点数。特别是在这种情况下 N 实际上可能是一个不能用任何浮点数 a 表示的数字,因此 a*a == N.

所以而不是

N == (root_N*root_N)

尝试使用类似

的东西
fabs(N-(root_N*root_N)) < epsilon

其中 epsilon 是您可接受的舍入误差。您可以选择 const float epsilon = 0.000001f 之类的内容。我认为在这种情况下,您可能需要在机器 epsilon 之上的东西,因为您可能会累积错误。

您还可以通过使用 double 而不是 float 来稍微提高精度。但是,这不会取代对 epsilon 的需求,只允许您选择一个较低的 epsilon。