Главная » Java » Java.math — математические операции

0

 

   Пакет Java.math, в данный момент содержащий два класса— Biglnteger и BigDecimal, — предназначен для использования при выполнении специальных математических вычислений. Класс Biglnteger реализует аппарат целочисленной арифметики произвольной точности и предлагает собственные версии всех операторов, за исключением оператора побитового логического сдвига >», который в данном случае равнозначен оператору » (арифметический сдвиг), поскольку в целом числе произвольной точности нет знакового бита, подлежащего копированию. По этой же причине методы clearBit и setBit класса, выполняющие операции над отдельными битами, не в состоянии изменить знак числа, бит которого выступает в роли аргумента. Бинарные побитовые операторы начинают работу с приведения размера меньшего операнда к размеру большего, сохраняя знак меньшего операнда. Объекты Biglnteger не допускают изменения содержимого, поэтому все операции с ними приводят к созданию новых объектов Biglnteger. Код следующего метода демонстрирует, каким образом может быть возвращен объект итератора, позволяющего получать простые множители заданного числа:

 

static final Biglnteger ONE = Biglnteger.valueOf(1);

static final Biglnteger TWO = Biglnteger.valueOf(2);

static final   Biglnteger THREE = Biglnteger.valueOf(3);

 

public static iterator factors(Biginteger num)  {

ArrayList factors = new ArrayList();

 

if (num.compareTo(ONE)  <= 0)  {

     factors.add(num);

      return factors.iterator();

}

 

Biglnteger div = TWO;               // делитель

Biglnteger divsq = Biglnteger.valueOf(4);   // Квадрат делителя

 

 

 

while  (num.сотрагето(divsq)  >= 0)   {

     Biglnteger[]   res = num.divideAndRemainder(div);

      if (res[l].signum()  = = 0)   {      // Если остаток равен нулю factors.add(div); num = res[0];

} else {        // попробовать следующий делитель

     if (div == TWO)

 div = THREE;

    else

   div = div.add(TWO);

 divsq = div.multiply(div);

  }

}

if (!num.equals(ONE))

   factors.add(num);

return factors.iterator() ;

}

Константы ONE, TWO и THREE используются неоднократно, поэтому для хранения их содержимого предусмотрены специальные объекты. Если число, подлежащее разложению на простые множители, не превышает единицы (классы Biglnteger и BigDecimal реализуют интерфейс Comparable, что существенно облегчает задачу сравнения их значений; за подробностями обращайтесь к разделу 16.3 на странице 441), программа трактует его как собственный множитель. После выполнения этой проверки метод приступает к выполнению действий по поиску чисел, потенциально пригодных на роль делителей. Если число делится текущим делителем нацело, это значит, что делитель является простым множителем, и далее в качестве делимого берется результат операции. Вначале в качестве делителя проверяется число 2, а затем все нечетные числа; процесс повторяется до тех пор, пока не будет достигнут делитель, квадрат которого превышает текущее значение делимого. Вы, разумеется, вправе попытаться каким-либо образом оптимизировать приведенный код; мы же привели его с единственной целью — продемонстрировать некоторые функции класса Biglnteger.

   Класс BigDecimal служит для представления знаковых десятичных чисел произвольной точности в виде мантиссы нефиксированной длины и масштабного коэффициента типа int, указывающего количество десятичных разрядов после точки.

   Операции деления и изменения масштабного коэффициента предполагают выполнение действий по округлению; для каждой конкретной операции может быть задано свое определенное правило округления — до следующего или предыдущего разрядов, до нуля или ближайшего значения. Программа в состоянии также вовсе отказаться от округления, выбрасывая исключение типа Arithmeti cException в случае нарушения предусмотренных вами требований.

 

Источник: Арнолд, Кен, Гослинг, Джеймс, Холмс, Дэвид. Язык программирования Java. 3-е изд .. : Пер. с англ. – М. : Издательский дом «Вильяме», 2001. – 624 с. : ил. – Парал. тит. англ.

По теме:

  • Комментарии