Я использую java и должен иметь дело с числами, большими, чем длинными (это 64 бита). Что я должен использовать? Каков размер BigInteger в java?
Большие числа, требующие более 64-битного представления
Ответ 1
Как вы упомянули в своем вопросе, вы должны использовать BigInteger.
Они могут быть настолько большими, насколько вам нужно - до тех пор, пока у вас не закончится память.
Ответ 2
Каков размер BigInteger в java?
Это немного сложно. Проблема в том, что в javadocs нет четкой спецификации предела.
-
Класс использует
int[]
для представления величины. Это означает, что он может потенциально представлять числа до((2^32)^(2^31 - 1)
. -
API имеет метод, который возвращает число в виде массива байтов с 2-мя дополнениями. Предел для этого -
((2^8)^(2^31 - 1)
. -
API имеет другой метод, который возвращает размер числа в битах... как
int
. Это подразумевает предел2^(2^31 - 1)
или, может быть,2^(2^32)
.
На практике эти цифры настолько велики, что вы, вероятно, сначала столкнетесь с ограничениями пространства кучи (или ограничениями производительности процессора).
проблема заключается в том, что я должен найти квадратный корень из числа.
Вы должны быть в состоянии найти алгоритм вычисления квадратных корней в ваших учебниках по математике (или Википедии). Кодирование должно быть простой задачей.
(Я бы указал вам пример кода, за исключением того, что это пахнет "домашней работой", и я не полностью доверяю коду, который нашел.)
Не забывайте, что большинство целых чисел имеют иррациональный квадратный корень...
Ответ 3
вы ищете либо класс BigDecimal, либо просто нужны целые числа, чем BigInteger. Его произвольная точность, поэтому размер изменяется в зависимости от того, насколько велики числа, которые вы вводите
Ответ 4
Чтобы найти квадратный корень из BigInteger, вам нужно выполнить поиск google с ответом "-StackOverflow". https://www.google.com/search?q=java+extract+root+bignum&ie=utf-8&oe=utf-8#q=java+root+BigInteger+-stackoverflow.com+-stackexchange.com дает первую ссылку на http://faruk.akgul.org/blog/javas-missing-algorithm-biginteger-sqrt/ Здесь является одним из алгоритмов. Предполагается, что Java будет "писать один раз, использовать всюду". Ну, некоторые пользователи SO верят, что вы должны изобретать велосипед. Спросите их о модуле, который они отвечают, "пахнет домашней работой, сделайте это самостоятельно". И да, BigInteger наполовину испечен. Он не может делать логарифмы или корни из коробки. Это очень медленно. Алгоритм приведен ниже.
BigInteger sqrt(BigInteger n) {
BigInteger a = BigInteger.ONE;
BigInteger b = new BigInteger(n.shiftRight(5).add(new BigInteger("8")).toString());
while(b.compareTo(a) >= 0) {
BigInteger mid = new BigInteger(a.add(b).shiftRight(1).toString());
if(mid.multiply(mid).compareTo(n) > 0) b = mid.subtract(BigInteger.ONE);
else a = mid.add(BigInteger.ONE);
}
return a.subtract(BigInteger.ONE);
}