2008-11-10 6 views
18

Какие библиотеки для Java существуют с быстрой реализацией операций с плавающей точкой или с фиксированной точкой с точностью до нескольких тысяч цифр? Насколько они хороши?Библиотека высокой точности с плавающей точкой с плавающей запятой Java

Требование ко мне заключается в том, что он реализует алгоритм умножения, который лучше алгоритма наивного умножения, который занимает в 4 раза больше времени для двукратного числа цифр (сравните Multiplication algorithms).

+0

Общий вопрос с точки зрения интереса ... какое ваше приложение требует нескольких тысяч цифр десятичной точности? – Simon 2008-11-10 09:27:24

+1

Это хобби, а не работа: я бы хотел рассчитать еще несколько цифр http://en.wikipedia.org/wiki/Feigenbaum_constant – 2008-11-11 08:10:01

ответ

35

На странице Arbitrary Precision Arithmetic есть три библиотеки: java.math (содержащий упомянутый BigDecimal), Apfloat и JScience. Я выполняю небольшую проверку скорости на них, которая просто использует сложение и умножение.

В результате, для относительно небольшого количества цифр BigDecimal в порядке (в два раза быстрее, чем другие для 1000 цифр), но если вы используете больше цифр, это далеко - JScience примерно в 4 раза быстрее. Но явным победителем является Apfloat. Другие библиотеки, похоже, используют алгоритмы наивного умножения, которые занимают время, пропорциональное квадрату числа цифр, но время Apfloat, кажется, растет почти линейно. На 10000 цифр он был в 4 раза быстрее, чем у JScience, но на 40000 цифр он в 16 раз быстрее, чем у JScience.

С другой стороны: JScience предоставляет ОТЛИЧНЫЕ функциональные возможности для математических задач: матрицы, векторы, символические алгоритмы, решения систем уравнений, а что нет. Поэтому я, вероятно, займусь JScience, а позже напишу обертку, чтобы интегрировать Apfloat в алгоритмы JScience - благодаря хорошему дизайну это кажется легко возможным.

(UPDATE: Я написал тестовый набор для номера пакета JScience и исправлен ряд ошибок Это продолжалось в релизе 4.3.1 Так что я могу порекомендовать проверить его...)

5

Вы проверили производительность BigDecimal? Я не вижу ничего очевидного в JavaDoc, но это, безусловно, будет мой первый порт захода.

+1

Для очень высокой точности это намного медленнее. Я бы рекомендовал это только в том случае, если у вас есть только десятки цифр или не заботятся о скорости. – 2011-11-08 19:01:49

+0

@ hstoerr: Хорошо, что вы его проверили, но я думаю, что подход «теста простейшей вещи, который будет работать» (где встроенное является значительным преимуществом отправной точки) по-прежнему является хорошим начальным шагом :) – 2011-11-08 21:03:46

2

Вы можете ознакомиться с библиотекой JScience и их номером Real. Я не уверен, насколько производительность по сравнению с BigDecimal, но целью библиотеки является предоставление высоконастраиваемых классов для научных приложений, что кажется хорошим знаком.

-3

Apfloat обеспечивает высокую точность на мантиссе, но, по-видимому, дает показатель экспоненциальности меньшей, чем обычно, в зависимости от того, что он падает с «Логарифмом нуля» для значений, которые могут обрабатывать double). Поэтому это не полезно для больших чисел.

Кроме того, документация говорит:

«ловушка существует с конструкторами Apfloat (поплавок, удлиненный) и Apfloat (двойной, длинным) Поскольку поплавки и двойники всегда представляются внутренне в поразрядных 2, преобразование в. любой другой радиус обычно вызывает ошибки округления, и полученный apfloat не будет точным до нужного числа цифр.

Например, 0.3 не может быть точно указана в базе 2. Когда вы создаете apfloat like новый Apfloat (0,3f, 1000), результирующее число будет неточным до 1000 цифр, но только до примерно 7 цифр (в радиусе 10). Фактически, получившееся число будет чем-то вроде 0,30000001192092896 ... »

Это, по-видимому, делает Apfloat минимально полезным.

BigDecimal не имеет функции логарифма, и в документации не указано, позволяет ли она делать большие числа, чем двойной; показатель составляет 32 бита, что-то вроде.