Metodi trigonometrici Java BigDecimal

Sto sviluppando un parser matematico che è in grado di valutare String come '5+b*sqrt(c^2)' . Sto usando ANTLR per l’analisi e fare buoni progressi. Ora mi sono BigDecimal class Java BigDecimal e BigDecimal pensato: hey, perché non pensare alla precisione qui.

Il mio problema è che l’API Java non fornisce metodi trigonometrici per BigDecimal come java.lang.Math . Sai se ci sono buone librerie matematiche come Apache Commons là fuori che si occupano di questo problema?

Le altre domande sono come realizzare il metodo di potenza in modo da poter calcolare 4.9 ^ 1.4 con BigDecimal s. È ansible?

È anche apprezzata una richiesta di libri sul calcolo numerico.

ApFloat è una libreria che contiene approssimazioni arbitrarie di precisione di funzioni trigonometriche e potenze non intere entrambe; tuttavia, utilizza le proprie rappresentazioni interne, piuttosto che BigDecimal e BigInteger . Non l’ho mai usato prima, quindi non posso garantire per correttezza o caratteristiche prestazionali, ma l’API sembra abbastanza completa.

BigDecimal non fornisce questi metodi perché BigDecimal modella un numero razionale. Le funzioni trigonometriche, le radici quadrate e le potenze per i non interi (che credo includa radici quadrate) generano tutti numeri irrazionali.

Questi possono essere approssimati con un numero di precisione arbitrario ma il valore esatto non può essere memorizzato in un BigDecimal . Non è davvero ciò per cui sono. Se stai approssimando qualcosa in ogni caso, puoi anche usare un double .

Utilizzando una funzionalità esistente di Java BigDecimals, vale a dire consentire aritmetica di precisione limitata come descritto qui , ho recentemente implementato sqrt / 1, exp / 1, tan / 1, ecc. Per questi oggetti numerici.

Gli stessi algoritmi numerici utilizzano serie Maclaurin e Taylor, oltre a riduzioni della gamma appropriate per assicurare velocità e ampiezza della serie.

Ecco un esempio di calcolo, Constant di Ramanujan:

 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 

Il thingy è stato scritto in una miscela di Prolog e Java. La velocità e la precisione sono ancora in corso. Il codice è attualmente open source su GitHub .

Praticamente il miglior libro sul calcolo numerico sarebbe Ricette numeriche

La libreria big-math fornisce tutte le funzioni matematiche avanzate standard (pow, sqrt, log, sin, …) per BigDecimal.

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