Я хочу знать long m
такое, что m*m*m <= Long.MAX_VALUE && Long.MAX_VALUE < (m + 1)*(m + 1)*(m + 1)
.
Как я могу вычислить вышеуказанное long m
?
Меня беспокоит переполнение, и я вообще не знаю о переполнении.
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
.
если Long.MAX_VALUE < (m + 1)*(m + 1)*(m + 1)
вы не можете вычислить его напрямую, используя long. Вы можете найти Math.cbrt(Long.MAX_VALUE)
@c0der Я боюсь ошибки при использовании функции Math.cbrt().
@tchappyha вы имеете в виду ошибку точности? или ошибка java?
Я имею в виду ошибку точности.
Я не хотел использовать число с плавающей запятой.
Вам не нужна 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 n*n*n == 9223372036854775808
, что больше, чем Long.MAX_VALUE == 9223372036854775807
. ideone.com/9lzfNT
double n = m + 1; System.out.println(n*n*n == Long.MAX_VALUE);
печатает верно. Этот тест неверен?
@ c0der да. Double не имеет достаточной точности, чтобы различать (максимальное значение) и (максимальное значение + 1). ideone.com/2b5yOm
Большое спасибо, 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);
переполняется.
Это нормально?
long i = 0, j = 1;
while (i*i*i < j*j*j) {
i++;
j++;
}
Sytem.out.println(i);
Для меня это больше похоже на математическая задача.