java - 这个算法可以找到一个系列的无穷大之和吗?

标签 java c algorithm math

<分区>

求以下数列的无穷和:

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 */

该算法在 CJAVA 中运行,两者都给出了 inf 的输出。用CJava写的打印语句分别是

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*/

我的一个 friend 说他在 C 中得到的输出是有限小数。但在我的例子中,程序从未终止,在 CJava 中(此输出来自上面发布的新编辑代码。不要考虑以前的错误的代码,它的输出是“INF”。)我的问题是,这个算法可以接受吗?如果是,那么我想知道在 C 中导致不同输出的可能性。谢谢。

最佳答案

The algorithm was run in C and JAVA and both gave the output as inf.

那是因为您的代码中存在错误。您从 i == 0 开始。当您计算 1.0/0 时,您会得到一个 INF。

该系列应该以i == 1 ...开始

您编辑了问题以修复该特定错误。

即便如此,您仍然永远无法获得无穷大总和的正确值。该级数发散(趋于无穷大),但考虑到您的计算方式,您无法到达那里。

最终,您将达到 1.0/i 太小而无法更改 sum 的点,您将跳出循环。我希望这会在 i == Integer.MAX_VALUE 之前发生……但如果没有发生,那么您将在代码中遇到另一个错误。如果 i 曾经达到 Integer.MAX_VALUE 那么它会环绕到 Integer.MIN_VALUE 并且你将开始添加 negative条款的总和。糟糕!


实际上,您要计算的是谐波级数。部分和(对于 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/

相关文章:

java - 谁能解释如何从 SonarQube 为 java 项目添加 xml 报告

c++ - 为什么有些 C/C++ 头文件前面有 "sys/"?

algorithm - 如何修改Lomuto分区方案?

java - Java中如何在不创建对象的情况下匹配正则表达式?

java - 如何通过gridView.setOnItemClickListener()中的intent()传递ArrayList数据

c - 如何在不使用字符串的情况下找到C中 float 的长度...?

algorithm - 在笛卡尔平面上找到最近的点?

c - 如何解决 C : 'can' t find a register in class 'GENERAL_REGS' while reloading 'asm' ' 中的内联汇编错误

java - ANTLR 仅匹配流中的特定字符串并忽略其余字符串

c# - 如何使用 Pinvoke 返回字符串数组