首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何正确舍入平方根函数?

如何正确舍入平方根函数?
EN

Stack Overflow用户
提问于 2018-09-10 14:05:05
回答 1查看 710关注 0票数 0

我目前正在开发一个Java数学库,它将包含各种正确舍入的函数(即sqrt、cbrt、exp、sin、gamma和ln)。我已经用巴比伦的方法写了一个平方根算法,它的准确度在正确答案的1ULP以内。但是,我不知道如何正确地计算数字应该以哪种方式四舍五入,以表示输入的实际平方根的最佳近似值。包含可以扩展到其他函数的原则的答案将是首选的,但我听说sqrt比许多超越函数更简单,而且专门的解决方案也会非常受欢迎。

此外,这里是我的代码的一个清理版本,因为这个问题的原始提交:

代码语言:javascript
复制
public static double sqrt(double x) {
    long bits = Double.doubleToLongBits(x);

    // NaN and non-zero negatives:
    if (Double.isNaN(x) || x < 0) return Double.NaN;

    // +-0 and 1:
    if (x == 0d || x == 1d) return x;

    // Halving the exponent to come up with a good initial guess:
    long exp = bits << 1;
    exp = (exp - 0x7fe0000000000000L >> 1) + 0x7fe0000000000000L >>> 1 & 0x7ff0000000000000L;
    double guess = Double.longBitsToDouble(bits & 0x800fffffffffffffL | exp);
    double nextUp, nextDown, guessSq, nextUpSq, nextDownSq;

    // Main loop:
    while (true) {
        guessSq = guess * guess;
        if (guessSq == x) return guess;
        nextUp = Math.nextUp(guess);
        nextUpSq = nextUp * nextUp;
        if (nextUpSq == x) return nextUp;
        if (guessSq < x && x < nextUpSq) {
            double z = x / nextUp;
            if (z * nextUp > x) z = Math.nextDown(z);
            return z < nextUp ? nextUp : guess;
        }
        nextDown = Math.nextDown(guess);
        nextDownSq = nextDown * nextDown;
        if (nextDownSq == x) return nextDown;
        if (nextDownSq < x && x < guessSq) {
            double z = x / guess;
            if (z * guess > x) z = Math.nextDown(z);
            return z < guess ? guess : nextDown;
        }

        // Babylonian method:
        guess = 0.5 * (guess + x / guess);
    }
}

如你所见,我使用除法作为测试。然而,我认为这需要除法四舍五入到0,这在Java中显然不会发生。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-10 15:50:42

根据泰勒定理,平方根函数被斜率为1/2√x的线性函数局部逼近,它是正的。所以你可以将误差与平方的误差联系起来,x- (√x )²,这里√x被理解为近似的根。然后,向最小化此误差的方向进行舍入。

无论如何,x- (√x)²的计算会受到灾难性的抵消,您可能需要扩展精度才能可靠地计算它。不确定付出的努力是否值得。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52251937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档