无端计算循环

A Non-end computing loop

这个循环似乎没有尽头。 "sum < 4.7183" 似乎是可能的。 发出正确的 "k" 雾,"k" 是程序使其成为阶乘的分母的最小可能值,然后我们得到短语 1/k!以及它们与初始值 sum 的总和,sum = 4。 真的 为什么? 问题出在哪里?

//Maybe it's impossibe in short time!    
import javax.swing.*; 
import java.text.*;

public class ConditionalMinK_61 {
    static double j;
    static double f;
    static double sum = 4;

    static int k = 2;

    static String sw;

    public static void SymSymHa() {
        DecimalFormat sa = new DecimalFormat("#.####");

        while(sum < 4.7183) {
            f=1;
            for(j = 1; j <= k; j++)
                f*=j;

            sum+=(1/f);    
            ++k;

            switch(k%8001) {    
                case 0:
                    sw = "|       |";
                    break;

                case 1000:
                    sw = "|L      |";
                    break;

                case 2000:
                    sw = "|LO     |";
                    break;

                case 3000 :
                    sw = "|LOA    |";
                    break;

                case 4000:
                    sw = "|LOAD   |";
                    break;

                case 5000:
                    sw = "|LOADI  |";
                    break;

                case 6000:
                    sw = "|LOADIN |";
                    break;

                case 7000:
                    sw = "|LOADING|";

            }

            System.out.println("Please Wait... S = "+sum+"      "+sw+"  k = "+k+"     Impossible");    
        }    
    }


    public static void Showit() {
        DecimalFormat bs = new DecimalFormat("#.###");    
        JOptionPane.showMessageDialog(null, "minimum acceptable value of \"K\" is : " + k, "RESULT", JOptionPane.INFORMATION_MESSAGE);    
        JOptionPane.showMessageDialog(null, "The war isn't on portability or security... it's on ruining power.", "A Quotation", JOptionPane.INFORMATION_MESSAGE);
    }

    public static void main(String args[]){
        SymSymHa();
        Showit();
    }
}

k达到171时,f的值变得很大,等于Double.POSITIVE_INFINITY。因此 1/f0.0 并且总和永远不会改变。 sum 增加直到达到 4.7182818284590455 然后停止增加,因此 while 循环是无限的。

试试这个

int k = 171;
double f = 1;
for(int j = 1; j <= k ; j++)
    f*=j;
System.out.println(f);
System.out.println(1/f);

输出为

Infinity
0.0

即使 double 算术完美地模拟了实数,您的程序也将是一个无限循环,因为您似乎试图近似 e + 2,即 4.7182818284590...,所以它无论如何都不会达到 4.7183