Как вычислить целое число m так, чтобы m ^ 3 <= Long.MAX_VALUE < (m + 1) ^ 3 на языке Java?

Я хочу знать long m такое, что m*m*m <= Long.MAX_VALUE && Long.MAX_VALUE < (m + 1)*(m + 1)*(m + 1).

Как я могу вычислить вышеуказанное long m?

Меня беспокоит переполнение, и я вообще не знаю о переполнении.

Для меня это больше похоже на математическая задача.

Rashin 27.06.2019 14:40
Long.MAX_VALUE == (2^63)-1. Если m == 2^(63/3) = 2^21, то m*m*m = 2^63. Итак, (m+1) == 2^21, а значит, m == (2^21)-1.
Andy Turner 27.06.2019 14:42

если Long.MAX_VALUE < (m + 1)*(m + 1)*(m + 1) вы не можете вычислить его напрямую, используя long. Вы можете найти Math.cbrt(Long.MAX_VALUE)

c0der 27.06.2019 14:49

@c0der Я боюсь ошибки при использовании функции Math.cbrt().

tchappy ha 27.06.2019 14:58

@tchappyha вы имеете в виду ошибку точности? или ошибка java?

c0der 27.06.2019 15:03

Я имею в виду ошибку точности.

tchappy ha 27.06.2019 15:08

Я не хотел использовать число с плавающей запятой.

tchappy ha 27.06.2019 15:09
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
7
52
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вам не нужна Java, чтобы решить эту проблему.

Long.MAX_VALUE == (2^63)-1. Если n == 2^(63/3) = 2^21, то n*n*n = 2^63. Итак, (m+1) == 2^21, а значит, m == (2^21)-1.

Если вы хотите написать код, чтобы убедиться в этом:

    long m = (1L << 21) - 1;
    System.out.println(m*m*m);                  // 9223358842721533951
    System.out.println(m*m*m < Long.MAX_VALUE); // true

    long n = m + 1;
    System.out.println(n*n*n);                  // -9223372036854775808

Итак, n*n*n явно переполнился, потому что его значение отрицательное.

(Обратите внимание, что если бы результат был положительным или даже больше, чем m*m*m, это не было бы доказательством того, что он переполнился не было. Это просто совпадение, что переполнение настолько очевидно).

Вы также можете использовать Long.compareUnsigned:

// Negative, so m*m*m < Long.MAX_VALUE)
System.out.println(Long.compareUnsigned(m*m*m, Long.MAX_VALUE));

// Positive, so unsigned n*n*n > Long.MAX_VALUE)
System.out.println(Long.compareUnsigned(n*n*n, Long.MAX_VALUE));
n*n*n == Long.MAX_VALUE , не так, как просили.
c0der 27.06.2019 14:58

@c0der n*n*n == 9223372036854775808, что больше, чем Long.MAX_VALUE == 9223372036854775807. ideone.com/9lzfNT

Andy Turner 27.06.2019 15:03
double n = m + 1; System.out.println(n*n*n == Long.MAX_VALUE); печатает верно. Этот тест неверен?
c0der 27.06.2019 15:16

@ c0der да. Double не имеет достаточной точности, чтобы различать (максимальное значение) и (максимальное значение + 1). ideone.com/2b5yOm

Andy Turner 27.06.2019 15:39

Большое спасибо, c0der.

Я могу использовать функцию Math.cbrt(), чтобы получить ответ.
И я могу проверить правильность ответа по методу Энди Тернера.

long m1 = (long) Math.cbrt((double) Long.MAX_VALUE); System.out.println(m1*m1*m1); m1++; System.out.println(m1*m1*m1);

m1*m1*m1 == Long.MAX_VALUE это не то, что вы ищете. Эта распечатка System.out.println(m1*m1*m1); переполняется.
c0der 27.06.2019 15:22

Это нормально?

long i = 0, j = 1;
while (i*i*i < j*j*j) {
    i++;
    j++;
}
Sytem.out.println(i);

Другие вопросы по теме