由于C ++部门缺乏精确性,如何提高结果的精度

时间:2013-07-07 04:08:39

标签: c++ precision

我正在处理leibniz问题,如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;
}

1 个答案:

答案 0 :(得分: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

BTW:您应该能够将表达式缩短为

res += ((i % 2) * 2 - 1) / (2.0 * i - 1)