我正在研究莱布尼茨问题,如图所示https://www.hackerrank.com/challenges/leibniz https://www.hackerrank.com/challenges/leibniz这里。
计算 1-1/3+1/5-1/7+1/9+... 序列中的每个元素可以定义为 a(i)=(-1)^i/(2*i+1 ) 从 0 开始 i。
题目要求从第一项到第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;
}
开始循环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 http://jsfiddle.net/smt56/1
顺便说一句:您应该能够将表达式缩短为
res += ((i % 2) * 2 - 1) / (2.0 * i - 1)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)