Closed. This question needs details or clarity. It is not currently accepting answers. Learn more。
想改进这个问题吗?添加细节并通过editing this post澄清问题。
求下列级数的和到无穷大:
1 1/2 1/3 1/4 1/5 ...
根据对某个科学家的解释,无穷远是任何点都不存在的点,即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 */
该算法在c语言和java语言中运行,并以inf的形式输出。
printf("%6f",sum);
System.out.println(sum);
编辑:
前面写的代码(在问题中)有一个错误,因为我键入了它,没有复制粘贴。很抱歉解决了这个问题,下面是我的问题的基础代码:
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*/
我的一个朋友说,他在C语言中得到的输出是一个有限的小数,但在我的例子中,这个程序在C语言和Java语言中都没有终止(这个输出是从上面发布的新编辑代码中得到的)。不要考虑以前的错误代码和它的输出是“inf”。)我的问题是,这个算法可以接受吗?如果是的话,我想知道C语言输出不同的原因。谢谢。
最佳答案
该算法在c语言和java语言中运行,并将输出作为inf。
那是因为你的代码中有一个bug从i == 0
开始当你计算1.0 / 0
时,你得到一个INF。
这个系列应该从i == 1
开始。
你编辑了这个问题来修正那个特别的错误。
即使如此,你仍然无法得到一个正确的和到无穷大的值数列发散(变为无穷大),但根据你的计算方法,你是不可能到达那里的。
最终,您将到达一个1.0/i
太小而无法更改sum
的点,并且您将脱离循环我希望这会在i == Integer.MAX_VALUE
之前发生。但如果没有,那么你的代码中就会遇到另一个bug如果i
曾经达到Integer.MAX_VALUE
的话,它将被包装成Integer.MIN_VALUE
并且您将开始在总和中添加负项哎呀!
实际上,你要计算的是谐波级数。部分和(对于n项)收敛到loge n+e,其中e是euler-mascheroni常数。
来源:https://en.wikipedia.org/wiki/Harmonic_series_%28mathematics%29#Partial_sums
由此,我们应该能够估计第n个部分和与1.0 / N
之间的差异何时大到足以停止迭代。
最后一点:如果你反方向求和,你会得到更精确的和;也就是说,从非常大的n开始,n减为1求和。
关于java - 这种算法可以找到序列的无穷大之和是否可以接受? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35861210/