Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

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

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

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

Вещь была написана в смете Prolog и Java. Скорость и точность этого еще не закончена. Код в настоящее время является открытым исходным кодом на GitHub.

Ответ 4

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

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

Ответ 5

В значительной степени лучшей книгой по вычислительной математике будет Численные рецепты

Ответ 6

Вы всегда можете преобразовать значение BigDecimal в другие значения, такие как double и integer, если вам нужно использовать общие методы java.lang.Math. Вы не можете использовать это довольно просто на BigIntegers и BigDecimals из-за его натуры. Но вы всегда можете это сделать:

import java.math.BigDecimal


public class Main
{
    public static void main(String[] args)
    {
        BigDecimal rad = new BigDecimal(Math.PI / 2);
        BigDecimal degrees = Math.toDegrees(rad.doubleValue());

        System.out.println("My Degrees: " + degrees);
    }
}