Java BigDecimal тригонометрические методы - PullRequest
12 голосов
/ 01 февраля 2010

Я занимаюсь разработкой математического синтаксического анализатора, который может оценивать строку как '5+b*sqrt(c^2)'.Я использую ANTLR для разбора и добился хорошего прогресса.Теперь я упал на класс Java BigDecimal и подумал: эй, почему бы не подумать о точности здесь.

Моя проблема в том, что API Java не предоставляет тригонометрические методы для BigDecimal с java.lang.Math.Знаете ли вы, есть ли какие-нибудь хорошие математические библиотеки, такие как Apache Commons, которые занимаются этой проблемой?

Другие вопросы: как реализовать метод power, чтобы я мог вычислить 4.9 ^ 1.4 с BigDecimal s?,Возможно ли это?

Также приветствуется запрос книги о численных вычислениях.

Ответы [ 5 ]

8 голосов
/ 01 февраля 2010

ApFloat - библиотека, которая содержит приближения произвольной точности тригометрических функций и нецелые степени; однако он использует свои собственные внутренние представления, а не BigDecimal и BigInteger. Я не использовал его раньше, поэтому я не могу поручиться за его правильность или характеристики производительности, но API кажется довольно полным.

7 голосов
/ 01 февраля 2010

BigDecimal не предоставляет эти методы, потому что BigDecimal моделирует рациональное число. Тригонометрические функции, квадратные корни и степени нецелых чисел (которые, я полагаю, включают в себя квадратные корни) все генерируют иррациональные числа.

Они могут быть аппроксимированы числом произвольной точности, но точное значение не может быть сохранено в BigDecimal. Это не совсем то, для чего они. Если вы все равно что-то аппроксимируете, вы можете просто использовать double.

1 голос
/ 26 июля 2017

Библиотека большой математики предоставляет все стандартные расширенные математические функции (pow, sqrt, log, sin, ...) для BigDecimal.

https://github.com/eobermuhlner/big-math

1 голос
/ 04 марта 2017

Используя существующую функцию Java BigDecimals, а именно, чтобы разрешить арифметику с ограниченной точностью, как описано здесь , я недавно реализовал sqrt / 1, exp / 1, tan / 1 и т. Д. Для этих числовых объектов.

Числовые алгоритмы сами по себе используют ряды Маклаурина и Тейлора, а также соответствующие сокращения диапазона, чтобы обеспечить достаточную скорость и широту ряда.

Вот пример расчета, константа Рамануджана:

Jekejeke Prolog 2, Runtime Library 1.1.8
(c) 1985-2017, XLOG Technologies GmbH, Switzerland

?- use_module(library(stream/console)).
% 0 consults and 0 unloads in 0 ms.
Yes

?- X is mp(exp(pi*sqrt(163)), 60).
X = 0d262537412640768743.999999999999250072597198185688879353856320

Эта штука была написана в смеси Пролога и Явы. Скорость и точность этого все еще в стадии разработки. Код в настоящее время с открытым исходным кодом на GitHub .

0 голосов
/ 01 февраля 2010

Лучшей книгой о численных вычислениях будет Числовые рецепты

...