Java BigDecimal тригонометрические методы

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

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

Другие вопросы, как реализовать метод мощности, чтобы я мог рассчитать 4,9 ^ 1,4 с BigDecimals. Это возможно?

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

5 ответов

Решение

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

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

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

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

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

Используя существующую особенность 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.

Практически лучшая книга о численных вычислениях - это " Численные рецепты".

Другие вопросы по тегам