Java BigDecimal тригонометрические методы
Я занимаюсь разработкой математического синтаксического анализатора, который способен оценивать строки как '5+b*sqrt(c^2)'
, Я использую ANTLR для разбора и добился хорошего прогресса. Теперь я упал на Java-класс BigDecimal
и подумал: эй, почему бы не подумать о точности здесь.
Моя проблема заключается в том, что Java API не предоставляет тригонометрических методов для BigDecimal
как java.lang.Math
, Знаете ли вы, есть ли хорошие математические библиотеки, такие как Apache Commons, которые занимаются этой проблемой?
Другие вопросы, как реализовать метод мощности, чтобы я мог рассчитать 4,9 ^ 1,4 с BigDecimal
s. Это возможно?
Запрос книги о числовых вычислениях также приветствуется.
5 ответов
ApFloat - это библиотека, которая содержит приближения произвольной точности тригометрических функций и нецелые степени; однако он использует свои собственные внутренние представления, а не BigDecimal
а также BigInteger
, Я не использовал его раньше, поэтому я не могу поручиться за его правильность или характеристики производительности, но API кажется довольно полным.
BigDecimal
не предоставляет эти методы, потому что BigDecimal
моделирует рациональное число. Тригонометрические функции, квадратные корни и полномочия для нецелых чисел (которые, я думаю, включает в себя квадратные корни) все генерируют иррациональные числа
Они могут быть аппроксимированы числом произвольной точности, но точное значение не может быть сохранено в BigDecimal
, Это не совсем то, для чего они. Если вы все равно что-то аппроксимируете, вы можете просто использовать double
,
Биг-математическая библиотека предоставляет все стандартные расширенные математические функции (pow, sqrt, log, sin, ...) для BigDecimal.
Используя существующую особенность 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.
Практически лучшая книга о численных вычислениях - это " Численные рецепты".