我正在处理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;
}
答案 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有一个更简单的问题来说明排序可能会有所不同:
BTW:您应该能够将表达式缩短为
res += ((i % 2) * 2 - 1) / (2.0 * i - 1)