Большие числа, требующие более 64-битного представления

Я использую java и имею дело с числами, превышающими long (64 бита). Что мне использовать? Каков размер BigInteger в Java?


person Ashwin    schedule 07.04.2012    source источник


Ответы (5)


Как вы упомянули в своем вопросе, вам следует использовать BigInteger.

Они могут быть сколь угодно большими - до тех пор, пока у вас не закончится память.

person Mark Byers    schedule 07.04.2012
comment
проблема в том, что мне нужно найти квадратный корень из числа. Но нет встроенной библиотеки для нахождения квадратного корня целого числа ошибки. - person Ashwin; 07.04.2012
comment
@Ashwin: Подождите, если квадратный корень не обязательно будет десятичным, почему вы просто не используете двойное? - person Hovercraft Full Of Eels; 07.04.2012
comment
@HovercraftFullOfEels: Как я уже сказал, мое число превышает 64 бита, тогда как размер double составляет 64 бита - person Ashwin; 07.04.2012
comment
@Ashwin: если квадратный корень не является десятичным числом, это не имеет смысла. Создайте двойное значение, которое приближается к значению вашего числа, и квадратный корень из него, вероятно, будет достаточно точным - если у вас нет особой причины для крайней точности. Если да, было бы неплохо узнать, в чем причина. - person Hovercraft Full Of Eels; 07.04.2012
comment
@HovercraftFullOfEels: хорошо, скажи мне, какой размер двойной. - person Ashwin; 07.04.2012
comment
@Ashwin - погуглите ... или поищите в Википедии, учебнике Oracle Java, спецификациях JVM и т. Д. И т. Д. - person Stephen C; 04.11.2014

Каков размер BigInteger в Java?

Это немного сложно. Проблема в том, что в документации javadoc нет четкой спецификации ограничения.

  • Класс использует int[] для представления величины. Это означает, что он потенциально может представлять числа до ((2^32)^(2^31 - 1).

  • В API есть метод, который возвращает число в виде массива байтов с дополнением до двух. Предел для этого составляет ((2^8)^(2^31 - 1).

  • В API есть еще один метод, который возвращает размер числа в битах ... как int. Это подразумевает ограничение в 2^(2^31 - 1) или, возможно, 2^(2^32).

На практике все эти числа настолько велики, что вы сначала вероятно столкнетесь с ограничениями пространства кучи (или ограничениями производительности ЦП).


проблема в том, что мне нужно найти квадратный корень из числа.

Вы должны быть в состоянии найти алгоритм вычисления квадратного корня в учебниках по математике для студентов (или в Википедии). Кодирование должно быть простой задачей.

(Я бы указал вам на пример кода, за исключением того, что он пахнет «домашним заданием», и я не совсем доверяю коду, который я нашел.)

Не забывайте, что большинство целых чисел имеют иррациональный квадратный корень ...

person Stephen C    schedule 07.04.2012

вы ищете либо класс BigDecimal, либо, если вам нужны просто целые числа, чем BigInteger. Его произвольная точность, поэтому размер меняется в зависимости от того, насколько велики числа, которые вы вводите.

person Ben    schedule 07.04.2012

Чтобы найти квадратный корень из 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);
}
person sixtytrees    schedule 27.06.2016

import java.util.Scanner; импорт java.math.BigDecimal;

public class Ha40 {

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    int i = scan.nextInt();
    long d=scan.nextLong();
    String st=" ";
    st=scan.next();
    st+= scan.nextLine();
    // Write your code here.

    System.out.println("String: " + st);
    System.out.println("Double: " + d);
    System.out.println("Int: " + i);
}

}

ввод: 2147483647 235345345345.234534 fsdfsdf sdf, но ans не достигает отметки

person Arsh Robil    schedule 20.03.2018