为什么这个 C 函数计算 sqrt 不适用于小数?

问题描述

#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,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。