如何解决为什么这个 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。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。