为什么这个计算 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。
#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。