可以找到以下系列的无穷大之和:
1 1/2 1/3 1/4 1/5 ...
Run Code Online (Sandbox Code Playgroud)
根据某位科学家的解释,无穷大是指任何点都不存在的点,即inf + x = inf或inf~(inf + x)= 0.因此,基于该理论,使用以下算法:
float sum=0.0;
for(int i=0;;i++){
if((sum+(1.0/i))==sum)
break;
sum+=(1.0/i);
}
/* print the value of sum */
Run Code Online (Sandbox Code Playgroud)
算法在C和JAVA中运行,两者都输出为inf.分别用C和Java编写的print语句是
printf("%6f",sum);
System.out.println(sum);
Run Code Online (Sandbox Code Playgroud)
编辑: 之前写的代码(在问题中)有一个错误,因为我键入它,没有复制粘贴.对不起.这解决了,这是我的问题的代码:
float sum=0.0;
for(int i=1;;i++){
if((sum+ (1.0/i))==sum)
break;
sum+=(1.0/i);
}
/*print the value of sum*/
Run Code Online (Sandbox Code Playgroud)
我的一个朋友说他把输出作为C中的有限小数.但在我的情况下,程序永远不会终止,无论是在C语言还是Java语言中(这个输出来自上面发布的新编辑代码.不要考虑以前的错误代码,它的输出是"INF".)我的问题是,是这算法可以接受?如果是,那么我想知道可能导致C中的不同输出.谢谢.
算法在C和JAVA中运行,两者都输出为inf.
那是因为您的代码中存在错误.你开始了i == 0
.当你计算1.0 / 0
得到一个INF.
这个系列应该以i == 1
...... 开头
您编辑了问题以修复该特定错误.
即便如此,你仍然永远无法得到无穷大和的正确值.该系列发散(进入无限远),但考虑到你计算它的方式,你无法实现这一目标.
最终,你将达到一个1.0/i
太小而无法改变的点,sum
你将摆脱循环.我希望在i == Integer.MAX_VALUE
... 之前会发生...但如果没有,那么你会遇到代码中的另一个错误.如果i
曾经达到过Integer.MAX_VALUE
那么它将会回合Integer.MIN_VALUE
并且您将开始在总和中添加负项.哎呀!
实际上,你想要计算的是谐波系列.部分和(对于N项)收敛到log e N + E,其中E是Euler-Mascheroni常数.
资料来源:https://en.wikipedia.org/wiki/Harmonic_series_%28mathematics%29#Partial_sums
由此,人们应该能够估计何时第N个部分和之间的差异1.0 / N
变得足够大以停止迭代.
最后一点:如果你向相反方向求和,你将获得更准确的总和; 即从非常大的N开始并且与N减少为1相加.