Autore Topic: expressione java math (BigDecimal)  (Letto 1763 volte)

Offline Ale

  • Nuovo arrivato
  • *
  • Post: 23
  • Respect: 0
    • Mostra profilo
expressione java math (BigDecimal)
« il: 18 Ottobre 2013, 23:45:20 CEST »
0
Salve a tutti Devs! Sto lavorando ad una calcolatrice per la subacquea, ma sono un pò a corto di fondamentali... In Excel, ho questa formula:

=(EXP((5.255876)* LOG(1 -0.0000225577*campoDepth,2.718)) * 10000)/10000

ove, campoDepth = new BigDecimal(txtDepth.getText().toString());

Come si scrive in java?

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +152
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:expressione java math (BigDecimal)
« Risposta #1 il: 19 Ottobre 2013, 08:38:08 CEST »
0

=(EXP((5.255876)* LOG(1 -0.0000225577*campoDepth,2.718)) * 10000)/10000

ove, campoDepth = new BigDecimal(txtDepth.getText().toString());

Come si scrive in java?
Grosso modo la formula potrebbe essere questa.

(Math.exp((5.255876)*Math.log(1 -0.0000225577*campoDepth.doubleValue()))*10000)/((double)10000)

Devi controllare gli arrotondamenti e le perdite di precisioni visto il tipo di formula.



Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:expressione java math (BigDecimal)
« Risposta #2 il: 19 Ottobre 2013, 10:04:26 CEST »
0
Mi pare di riconoscere una formula della pressione... avevi già provato ad usare la formula nella sua forma originaria (quella con esponente decimale) usando ma funzione Math.pow?

 = Math.pow( (double)(1 - depth / 44330 ) , 5.255876 )

Il  *10000/10000 non l'ho capito.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:expressione java math (BigDecimal)
« Risposta #3 il: 19 Ottobre 2013, 15:08:57 CEST »
0
Ignoro il motivo del uso di BigDecimal per una formula del genere ? Comunque la classe BigDecimal non ha le funzioni esponenziali, logaritmiche e di potenza con esponente non intero.
adb logcat | tee /tmp/logcat | grep TAG

Offline Ale

  • Nuovo arrivato
  • *
  • Post: 23
  • Respect: 0
    • Mostra profilo
Re:expressione java math (BigDecimal)
« Risposta #4 il: 20 Ottobre 2013, 16:01:44 CEST »
0
Indovinato al primo colpo. In effetti, si tratta della formula della pressione atmosferica...  (e 10000/10000 in effetti non ha senso... :-))

Riassumendo, mi pare di capire che devo lavorare con la classe double, visto che BigDecimal non ha le funzioni esponenziali, logaritmiche e di potenza con esponente non intero.

Ok. Ora, la pressione entra in questa seconda formula. Come la riscrivo?

Codice (Java): [Seleziona]
campoTOD = ((campoDepth.divide(campoPRESSURE)).divide(new BigDecimal(1.027)));
Qualcuno mi suggerisce una buona risorsa online per studiarmi quasta classe? Grazie a tutti, a buon rendere e buon lavoro...
« Ultima modifica: 20 Ottobre 2013, 16:03:51 CEST da Ale »

Offline Ale

  • Nuovo arrivato
  • *
  • Post: 23
  • Respect: 0
    • Mostra profilo
Re:expressione java math (BigDecimal)
« Risposta #5 il: 23 Ottobre 2013, 16:05:11 CEST »
0
Nessun suggerimento al proposito!?? Mi sarebbe davvero utile...

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +152
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:expressione java math (BigDecimal)
« Risposta #6 il: 23 Ottobre 2013, 18:14:45 CEST »
0
Se ho ben capito la domanda
Codice (Java): [Seleziona]
double campoPRESSURE =(EXP((5.255876)* LOG(1 -0.0000225577*campoDepth,2.718)) * 10000)/10000

campoTOD = ((campoDepth.divide(new BigDecimal(campoPRESSURE))).divide(new BigDecimal(1.027)));

Offline Ale

  • Nuovo arrivato
  • *
  • Post: 23
  • Respect: 0
    • Mostra profilo
Re:expressione java math (BigDecimal)
« Risposta #7 il: 26 Ottobre 2013, 15:43:04 CEST »
0
Grazie dell'aiuto! Ho risolto tutto, tranne un punto. Dovrei impostare la base del logaritmo (2.718). In Excel ci arrivo, ma in java?

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:expressione java math (BigDecimal)
« Risposta #8 il: 26 Ottobre 2013, 17:21:59 CEST »
0
Il numero 2.718 è una approssimazione troppo grossolana del numero di Eulero o Neplero e, ha infinite cifre (è un numero trascendente), sconsiglio di usare così poche cifre significative. Java ha la funzione per il calcolo del logaritmo in base e detto anche logaritmo naturale di un double, non devi specificare la base:


http://developer.android.com/reference/java/lang/Math.html#log(double)
adb logcat | tee /tmp/logcat | grep TAG

Offline Ale

  • Nuovo arrivato
  • *
  • Post: 23
  • Respect: 0
    • Mostra profilo
Re:expressione java math (BigDecimal)
« Risposta #9 il: 26 Ottobre 2013, 21:06:36 CEST »
0
Grazie per l'aiuto iceweasel, ottima spiegazione. A questo punto però, il mio problema è un altro... Per quale cavolo di motivo

Codice (Java): [Seleziona]
campoPRESSURE = Math.exp((5.255876)*Math.log(1 -0.0000225577*300)); 
dà un risultato (0.964... GIUSTO) e 

Codice (Java): [Seleziona]
campoPRESSURE = Math.exp((5.255876)*Math.log(1 -0.0000225577*campoDepth.doubleValue()));
(con ovviamente campoDepth pari a 300) ne da un altro (0.998...SBAGLIATO!)?

Pensavo fosse dovuto alla base del logaritmo, ma evidentemente non è così... io non ci arrivo!?!?!?!...
« Ultima modifica: 26 Ottobre 2013, 21:12:09 CEST da Ale »

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:expressione java math (BigDecimal)
« Risposta #10 il: 27 Ottobre 2013, 08:51:38 CET »
0
Ma se usi la formula originaria (non quella rimaneggiata per excel), che numero ti esce?

Codice (Java): [Seleziona]
campoPRESSURE  = Math.pow( (double)(1 - campoDepth.doubleValue() / 44330 ) , 5.255876 )
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:expressione java math (BigDecimal)
« Risposta #11 il: 27 Ottobre 2013, 10:39:40 CET »
0
Sei sicuro del valore che hai riportato ? Io ho fatto le varie prove con BigDecimal, base logaritmo troncato e Math.pow e non da' uno scostamento così elevato.

Visto che non hai vantaggi a usare la classe BigDecimal utilizza sempre il tipo "double", solo quando visualizzi il risultato arrotondi con il numero di cifre desiderate. Se hai numeri interi come "1" e gli usi per un calcolo in float point scrivilo con almeno un punto "1." così non rischi di fare calcoli con interi non voluti e eviti eventuali cast. Il numero "0.0000225577" è brutto da vere e da leggere uso la notazione con le potenze di 10 in questo modo "2.25577E-05" e non è una buona approssimazione di "1/44330 ≅ 2.2558087074216106E-5" (se è questo il numero originale).
« Ultima modifica: 27 Ottobre 2013, 10:43:27 CET da iceweasel »
adb logcat | tee /tmp/logcat | grep TAG

Offline Ale

  • Nuovo arrivato
  • *
  • Post: 23
  • Respect: 0
    • Mostra profilo
Re:expressione java math (BigDecimal)
« Risposta #12 il: 27 Ottobre 2013, 18:45:59 CET »
0
Errore mio! Nella fomula ho inserito la profondità, invece dell'altezza slm. Tutto torna ora.... Grazie mille del supporto !