这个算法是否可以找到一系列可接受的无穷大的总和?

0 c java algorithm math

可以找到以下系列的无穷大之和:

1  1/2  1/3  1/4  1/5 ...
Run Code Online (Sandbox Code Playgroud)

根据某位科学家的解释,无穷大是指任何点都不存在的点,即inf + x = infinf~(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)

算法在CJAVA中运行,两者都输出为inf.分别用CJava编写的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中的不同输出.谢谢.

Ste*_*n C 8

算法在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相加.