Java: разница между <и <= для длинного целого числа для 9223372036854775807L - PullRequest
1 голос
/ 15 февраля 2020

Когда я запускаю следующий код в JVM, я не могу понять, почему он так себя ведет. Насколько я понимаю, оператор < x должен go до x-1.

  public class LongQuestion {

  public static void main(String[] args) {

        if(9223372036854775807L < Math.pow(2,63)) {
            System.out.println("True");                            // DOES NOT GET PRINTED
        }

         if(9223372036854775807L <= Math.pow(2,63) - 1 ) {
            System.out.println("Also True");                       // THIS GETS PRINTED
        }

    }

}

Я хочу понять, почему Java ведет себя так.

Ответы [ 2 ]

2 голосов
/ 15 февраля 2020

Math.pow объявлено как

public static double pow​(double a, double b)

Итак, мы имеем дело с двойными. Math.pow(2,63) - это "2.0d ^ 63.0d" (сила, а не эор). Поскольку double составляет всего 64 бита, изменение значения на 60 нечетных битов ниже самого старшего бита не изменит значения. Таким образом, Math.pow(2,63) == Math.pow(2,63) - 1, что также (double)9223372036854775807L.

Делает косвенные броски неявными в первом if.

    if((double)9223372036854775807L < Math.pow(2.0d,63.0d)) {
        System.out.println("True");                            // DOES NOT GET PRINTED
    }

Левая и правая части < являются 9.223372036854776E18, значит false.

1 голос
/ 15 февраля 2020

Следующий код поможет вам понять это:

public class Main {
    public static void main(String[] args) {
        System.out.println("Long.MAX_VALUE is " + Long.MAX_VALUE);
        System.out.println("Math.pow(2, 63) is " + Math.pow(2, 63));
        System.out.println("Math.pow(2, 63) - 1 is " + (Math.pow(2, 63) - 1));
        System.out.println("(long)Math.pow(2, 63) is " + (long) Math.pow(2, 63));
        System.out.println("(long)(Math.pow(2, 63) - 1) is " + (long) (Math.pow(2, 63) - 1));

        if (9223372036854775807L < Math.pow(2, 63)) {
            System.out.println("9223372036854775807L < Math.pow(2, 63)");
        }

        if (9223372036854775807L <= Math.pow(2, 63)) {
            System.out.println("9223372036854775807L <= Math.pow(2, 63)");
        }

        if (9223372036854775807L <= Math.pow(2, 63) - 1) {
            System.out.println("9223372036854775807L <= Math.pow(2, 63) - 1");
        }

        if (9223372036854775807L < (long) Math.pow(2, 63)) {
            System.out.println("9223372036854775807L < (long)Math.pow(2, 63)");
        }

        if (9223372036854775807L <= (long) Math.pow(2, 63)) {
            System.out.println("9223372036854775807L <= (long)Math.pow(2, 63)");
        }

        if (9223372036854775807L <= (long) Math.pow(2, 63) - 1) {
            System.out.println("9223372036854775807L <= (long)Math.pow(2, 63) - 1");
        }

        if (9223372036854775807L <= (long) (Math.pow(2, 63) - 1)) {
            System.out.println("9223372036854775807L <= (long)(Math.pow(2, 63) - 1)");
        }
    }
}

Вывод:

Long.MAX_VALUE is 9223372036854775807
Math.pow(2, 63) is 9.223372036854776E18
Math.pow(2, 63) - 1 is 9.223372036854776E18
(long)Math.pow(2, 63) is 9223372036854775807
(long)(Math.pow(2, 63) - 1) is 9223372036854775807
9223372036854775807L <= Math.pow(2, 63)
9223372036854775807L <= Math.pow(2, 63) - 1
9223372036854775807L <= (long)Math.pow(2, 63)
9223372036854775807L <= (long)(Math.pow(2, 63) - 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...