3

我正在研究这里的https://www.hackerrank.com/challenges/leibniz所示的莱布尼茨问题。它计算 1-1/3+1/5-1/7+1/9+... 序列中的每个元素都可以定义为 a(i)=(-1)^i/(2*i+1 ) 从 0 开始。

问题要求从第一项到第n项相加并输出结果。我的程序通过了基本的测试用例。但在其他情况下它会失败。

我想我的程序错误是由于数字足够大时的精度。

任何人都可以提供一种方法来提高结果的精度吗?

double leibnitz(int n) {
    double res = 0.0;
    for (int i = 1; i <= n; i++) {
        res += 1.0 / (2 * i - 1) * (i % 2 == 1 ? 1.0 : -1.0);
    }
    return res;
}
4

1 回答 1

2

开始循环n并倒计时。

原因是 0 附近的小数可以以更高的精度相加,因为前导零将在浮点数的指数部分表示(因此称为“浮点数”),从而使更多的尾数可用。因此,您可以通过更精确的较小部分的总和来接近 1。

循环应如下所示:

for (int i = n; i >= 1; i--) {
    res += 1.0 / (2 * i - 1) * (i % 2 == 1 ? 1.0 : -1.0);
}

Jsfiddle 用一个更简单的问题来说明排序可能会有所不同:

http://jsfiddle.net/smt56/1

顺便说一句:您应该能够将表达式缩短为

res += ((i % 2) * 2 - 1) / (2.0 * i - 1)
于 2013-07-07T04:50:26.657 回答