为什么我不能打印最大长值?

时间:2015-10-16 01:52:30

标签: java printing long-integer

我正在使用for循环编译Java程序以找出long的最大值。但是,运行程序时没有打印任何内容。为什么呢?

这是我的代码:

x = 0.001:0.05:4*pi;
f = cos(x)+10*sin(x)./x;
hold on
plot(x,f,'r')
axis([0,4*pi,-3,3])
grid on

bid = x(abs(f)>1);
ha = area([0 bid], [10 10]);
hold off

4 个答案:

答案 0 :(得分:5)

主要是因为时间。

long的{​​{3}}约为~9.22 quintillion。你从零开始并递增。这意味着你需要经过9个quintillion循环才能换行并打破。我只是尝试在我的javascript控制台中运行20亿次操作,并在我强制退出之前超时几分钟。

如果你坐在那里让它跑得足够长,你就可以得到你的输出。或者,在已经接近最大值的地方开始i,例如 9,223,372,036,854,700,000 ,看看它是否仍然给你相同的问题。在Java 8中,允许max。将i初始化为类似9_223_372_036_854_700_000L的内容可以更及时地为您提供帮助。

最大长度非常高,位于9.223372e+18adding underscore to numeric literals9,223,372,036,854,775,807是有问题的数字。这也有助于整个"这是有效的,它只需要花费太长时间"理论

答案 1 :(得分:1)

我很好奇需要多长时间,所以我写了一堂课来做同样的事情。用单独的线程将其写入,以便每1秒将结果更新到控制台。

“ int”结果

1,343,211,433   37.4518434691484288634492200 % left

Max Value: 2,147,483,647
Time Taken (seconds): **1.588**

“长”结果

1,220,167,357   99.9999999867709190074470400 % left
2,519,937,368   99.9999999726787843108699600 % left
3,881,970,343   99.9999999579115932059510100 % left
5,210,983,861   99.9999999435023997711689800 % left
6,562,562,290   99.9999999288485570811055300 % left
7,853,387,353   99.9999999148534037050721500 % left
9,137,607,100   99.9999999009298653086103000 % left
10,467,975,104  99.9999998865059865071902600 % left
11,813,910,300  99.9999998719133278719112300 % left
13,183,196,499  99.9999998570674971548090400 % left
...it continues on and on...

1,362,032,97-第2个和第3个值之间的差(1秒)
6,771,768,529秒-达到long的最大值(Long.MAX_VALUE / 2nd3rdDifference)需要多少秒
6,771,768,529秒= 214.73年(每次由Google搜索转换)

因此,如果我的计算正确的话……那么,当一台普通计算机通过递增并检查是否溢出来计算long的最大值时,您将已经死了。你的孩子会死的。您的孙子们,完成时可能会在附近...

最大值计算代码

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.NumberFormat;

public class MainLongMaxTest {

    // /*
    public static final long MAX_VALUE = Long.MAX_VALUE;
    public static long value = 0;
    public static long previousValue = 0;
    // */

    /*
    public static final int MAX_VALUE = Integer.MAX_VALUE;
    public static int value = 0;
    public static int previousValue = 0;
    */

    public static boolean done;
    public static BigDecimal startTime;
    public static BigDecimal endTime;

    public static void main(String[] args) {

        Runnable task = new StatusPrinterRunnable();
        new Thread(task).start(); // code waits 1 second before result printing loop

        done = false;
        startTime = new BigDecimal(System.currentTimeMillis());

        while(value >= 0) {
            previousValue = value;
            value += 1;
        }

        endTime = new BigDecimal(System.currentTimeMillis());
        done = true;
    }
}

class StatusPrinterRunnable implements Runnable {

    public static final NumberFormat numberFormat = NumberFormat.getNumberInstance();
    private static long SLEEP_TIME = 1000;

    @Override
    public void run() {

        try { Thread.sleep(SLEEP_TIME); } catch (InterruptedException e) { throw new RuntimeException(e);   }
        while(!MainLongMaxTest.done) {  
            long value                  = MainLongMaxTest.value;
            //long valuesLeft           = MAX_VALUE - value;

            BigDecimal maxValueBd       = new BigDecimal(MainLongMaxTest.MAX_VALUE);
            BigDecimal valueBd          = new BigDecimal(value);
            BigDecimal differenceBd     = maxValueBd.subtract(valueBd);
            BigDecimal percentLeftBd    = differenceBd.divide(maxValueBd, 25, RoundingMode.HALF_DOWN);
            percentLeftBd               = percentLeftBd.multiply(new BigDecimal(100));
            String numberAsString       = numberFormat.format(value);
            String percentLeftAsString  = percentLeftBd.toString();
            String message = "" + numberAsString + "\t" + percentLeftAsString + " % left";
            System.out.println(message);

            try { Thread.sleep(SLEEP_TIME); } catch (InterruptedException e) { throw new RuntimeException(e);   }
        }

        BigDecimal msTaken = MainLongMaxTest.endTime.subtract(MainLongMaxTest.startTime);
        BigDecimal secondsTaken = msTaken.divide(new BigDecimal("1000"));

        System.out.println();
        System.out.println("Max Value: " + numberFormat.format(MainLongMaxTest.previousValue));
        System.out.println("Time Taken (seconds): " + secondsTaken);
    }
}

答案 2 :(得分:0)

我认为你的逻辑是正确的,只需花费大量时间来达到这个价值。

可以容纳的最大长值是Long.MAX_value,即9223372036854775807L

为了加快逻辑,我修改了程序如下,得到了预期的结果。

public static void main(String args[]) {
        long i = 9223372036854775806L;
        long result = 0L;

        for (; ; ) {
            result = i++;
            if (i<0) {
              System.out.println("result"+result);
             System.out.println("i"+i);

             break;
            }
        }
        System.out.println("The biggest integer: is" + result);

}

输出:

result9223372036854775807 I-9223372036854775808 最大整数:is9223372036854775807

结果具有在它变为最小值后可以容纳的最大值。

答案 3 :(得分:-1)

如果通过以下方式利用二进制代数,则可以一步得到结果:

结果= -1公升>>> 1;