gpt4 book ai didi

algorithm - 哪种浮点比较更准确,为什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:22:35 24 4
gpt4 key购买 nike

我正在尝试使用不同的牛顿法计算平方根。一个重要的决定是何时终止算法。

显然,使用 y*yx 之间的绝对差是行不通的,其中 y 是平方的当前估计值x 的根,因为对于较大的 x 值,可能无法以足够的精度表示其平方根。

所以我应该使用相对标准。天真地我会使用这样的东西:

static int sqrt_good_enough(float x, float y) {
return fabsf(y*y - x) / x < EPS;
}

这看起来效果很好。但最近我开始阅读 Kernighan 和 Plauger 的编程风格的要素,他们在第 1 章中为相同的算法提供了一个 Fortran 程序,其终止条件用 C 语言翻译为:

static int sqrt_good_enough(float x, float y) {
return fabsf(x/y - y) < EPS * y;
}

两者在数学上是等价的 ,但是有理由偏爱其中一种形式吗?

最佳答案

它们仍然不等价;底部的在数学上等同于 fabsf(y*y - x) / (y*y) < EPS .我看到你的问题是,如果 y*y溢出(可能是因为 xFLT_MAX 并且不幸选择了 y),那么终止可能永远不会发生。以下交互使用 double 。

>>> import math
>>> x = (2.0 - 2.0 ** -52) * 2.0 ** 1023
>>> y = x / math.sqrt(x)
>>> y * y - x
inf
>>> y == 0.5 * (y + x / y)
True

编辑:正如评论(现已删除)所指出的,在迭代和终止测试之间共享操作也很好。

EDIT2:两者都可能有低于正常的问题 x . professionals标准化 x避免两个极端的并发症。

关于algorithm - 哪种浮点比较更准确,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9528151/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com