【发布时间】:2018-11-16 23:14:34
【问题描述】:
我已经实现了这个功能:
double heron(double a)
{
double x = (a + 1) / 2;
while (x * x - a > 0.000001) {
x = 0.5 * (x + a / x);
}
return x;
}
此功能按预期工作,但我希望对其进行改进。它应该使用无限的while循环来检查类似于x * x的东西是否是a。 a 是用户应该输入的数字。
到目前为止,我还没有使用该方法的工作功能...这是我惨败的尝试:
double heron(double a)
{
double x = (a + 1) / 2;
while (x * x != a) {
x = 0.5 * (x + a / x);
}
return x;
}
这是我的第一篇文章,如果有什么不清楚或需要补充的地方,请告诉我。
第 2 次尝试失败:
double heron(double a)
{
double x = (a + 1) / 2;
while (1) {
if (x * x == a){
break;
} else {
x = 0.5 * (x + a / x);
}
}
return x;
}
【问题讨论】:
-
你永远不应该真正测试浮点变量是否相等,尤其是非理性值。在大多数情况下,您的第二个函数可能会永远循环。此外,还有更快的计算平方根的方法,但您已经知道了,对吧?
-
while (x * x != a)很可能总是正确的,除了一些具有精确表示的值。第一个示例使用 epsilon 容差是有原因的。请参阅Is floating point math broken? 和Why Are Floating Point Numbers Inaccurate? -
很少有测试浮点变量是否相等的好时机。相等表示循环完成。附带条件是平等测试不是完成的唯一测试。 @WeatherVane 第一个代码的
x * x - a > 0.000001对FP 函数的某些epsilon 的使用不当。对于x的大值是没有意义的,对于x的小值来说太大了。对某些 epsilon 的相对使用在这里可能有意义,但不是绝对的编码。
标签: c square-root