Il linguaggio JavaScript
 

Problema numerico: calcolo dell'inverso e ritorno al numero originario

Sap7 10 Set 2015 19:03
Salve a tutti,
ho un problema che non so proprio come gestire.

Ho bisogno di cambiare unita' di misura di alcuni parametri numerici
senza perdere la precisione della conversione.

Mi spiego.

Se ad esempio ho un valore pari a 111 millimetri e volessi convertirlo
in pollici, prendo il valore del campo di input e lo moltiplico per il
fattore di conversione opportuno.

Nel caso in esempio, semplicemente eseguendo moltiplicazione e
divisione, javascript mi da come risultato:

111 * (1/25.4) = 4.370078740157427

Ora, se faccio l'operazione a ritroso

4.370078740157427 * 25.4 = 110.99999999999865

Questo è ovviamente dovuto al numero "limitato" di decimali che tratta.


La mia necessità invece è di invertire un numero e tornare al numero
iniziale senza perdere nulla.

L'esempio riportato è il più semplice dei casi, perchè mi trovo a
ragionare con grandezze elevate alla 4 o divise per numeri con potenze
strane, quindi un semplice round non lo reputo così affidabile.

Come potrei risolvere?

Grazie in anticipo.
fmassei@gmail.com 10 Set 2015 22:01
On Thursday, September 10, 2015 at 7:03:16 PM UTC+2, Sap7 wrote:
> Salve a tutti,
> ho un problema che non so proprio come gestire.
>
> Ho bisogno di cambiare unita' di misura di alcuni parametri numerici
> senza perdere la precisione della conversione.
>
> Mi spiego.
>
> Se ad esempio ho un valore pari a 111 millimetri e volessi convertirlo
> in pollici, prendo il valore del campo di input e lo moltiplico per il
> fattore di conversione opportuno.
>
> Nel caso in esempio, semplicemente eseguendo moltiplicazione e
> divisione, javascript mi da come risultato:
>
> 111 * (1/25.4) = 4.370078740157427
>
> Ora, se faccio l'operazione a ritroso
>
> 4.370078740157427 * 25.4 = 110.99999999999865
>
> Questo è ovviamente dovuto al numero "limitato" di decimali che tratta.
>
>
> La mia necessità invece è di invertire un numero e tornare al numero
> iniziale senza perdere nulla.
>
> L'esempio riportato è il più semplice dei casi, perchè mi trovo a
> ragionare con grandezze elevate alla 4 o divise per numeri con potenze
> strane, quindi un semplice round non lo reputo così affidabile.
>
> Come potrei risolvere?
>

Leggendo questo, con attenzione:
https://ece.uwaterloo.ca/~dw*****er/Numerical*****ysis/02Numerics/Double/paper.pdf
Sì, è lungo, ma è più grave che tu non sappia i suoi contenuti.

Ciao!
4ndre4 23 Set 2015 00:30
On Thursday, 10 September 2015 18:03:16 UTC+1, Sap7 wrote:

[...]
> La mia necessità invece è di invertire un numero e tornare al numero
> iniziale senza perdere nulla.

Quel che accade nel tuo esempio e` perfettamente normale. Ogni standard floating
point presenta gli stessi problemi di round-off. Non e` qualcosa che puoi
bypassare. Notoriamente, le equivalenze esatte tra numeri in fp non dovrebbero
mai essere fatte. Dovresti avere un epsilon sufficientemente piccolo, e
confrontare i due numeri fp considerandoli uguali quando la loro differenza e`
inferiore all'epsilon scelto.

[...]
> Come potrei risolvere?

Usando una libreria di aritmetica in precisione multipla.

Grave, comunque, che un programmatore sia a digiuno di questi argomenti :)

https://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic
Alessandro Pellizzari 23 Set 2015 08:57
Il Thu, 10 Sep 2015 19:03:13 +0200, Sap7 ha scritto:

> Ho bisogno di cambiare unita' di misura di alcuni parametri numerici
> senza perdere la precisione della conversione.

Cerca "javascript gmp" su Google. Ci sono diversi progetti che lo
implementano.

Naturalmente devi aspettarti un crollo verticale delle prestazioni.

Bye.

Links
Giochi online
Dizionario sinonimi
Leggi e codici
Ricette
Testi
Webmatica
Hosting gratis
   
 

Il linguaggio JavaScript | Tutti i gruppi | it.comp.lang.javascript | Notizie e discussioni javascript | Javascript Mobile | Servizio di consultazione news.