PDA

Visualizza la versione completa : Linguaggi - Programmazione - Calcolo numerico


Fractals87
19-01-2015, 18:15
Sto appurando che a fronte di come è disposta l'operazione e il tipo di linguaggio utilizzato, si possono ottenere risultati differenti.
Questo accade quando ci sono numeri molto piccoli (tipo 10 cifre decimali) e come il programma rappresenta un numero in doppia precisione.

Online non ho trovato nulla di attendibile e sto cercando di convertire una vecchia funzione FORTRAN in js, ma alla fine ottengo risultati differenti e vorrei capire perchè e dove il pc sbaglia.

Sapete aiutarmi?

lnessuno
19-01-2015, 18:48
Javascript gestisce i decimali in modo tutto suo (non è il solo, in effetti), il problema è quello...

Dai un'occhiata qua (non è tecnico ma spiega come funziona il calcolo decimale) http://floating-point-gui.de/basic/

MItaly
19-01-2015, 19:02
Ma ottieni errori macroscopici o sulle ultime cifre decimali? Giusto per capire se è un problema dovuto all'uso del floating point o se c'è qualche altro genere di pasticcio (conversioni a tipi sbagliati, regole diverse del linguaggio sugli operatori, ...).

Fractals87
20-01-2015, 10:02
allora già in fortran la rappresentazione di un decimale in precisione doppia è così :

0.581 equivale a 0.581D0 viene rappresentato come 0.58099999999999996.
con D0 lo dichiaro esplicitamente.
Se invece non lo dichiaro ma viene automaticamente trasformato dal fortran con la dichiarazione :
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
ottengo un altro valore ancora più scorretto (si parla dalla 6° cifra in poi).

Il programma convertito integra una centinaia di righe di formule, e il risultato viene sballato piano piano ad ogni operazione.
Ottenendo infine un errore dalla 4° cifra decimale in poi.

Premetto che il software ha tante sottrazioni divisioni moltiplicazioni somme sequenziali (mi pare di aver letto che anche possa generare problemi).
Le parentesi sono messe tutte al posto giusto.

Tutte le variabili in fortran sono dichiarate con doppia precisione.

in js (il tipo non deve essere dichiarato e da quanto ne so al momento di assegnazione al tipo di dato js una già la precisione doppia)
sono tutti numerici e le 4 variabili acquisite da form sono state tutte passate sotto la funzione parseFloat()

Fractals87
20-01-2015, 10:06
Javascript gestisce i decimali in modo tutto suo (non è il solo, in effetti), il problema è quello...

Dai un'occhiata qua (non è tecnico ma spiega come funziona il calcolo decimale) http://floating-point-gui.de/basic/

Tutto quello che sapevo sui computer è caduto come un castello di carta...
Ora posso finalmente dire "STUPIDI COMPUTER non sanno fare neanche una somma"

Alhazred
20-01-2015, 12:09
Non ti aspettavi mica che si potessero rappresentare infiniti numeri con un numero finito di bit, no?

Fractals87
20-01-2015, 12:14
no ci mancherebbe.
Però mi chiedo perchp un'operazione o una rappresentazione di un numero in un linguaggio differisce da un'altro?

hfish
20-01-2015, 12:54
perche' ogni linguaggio gestisce i tipi e le operazioni come preferisce

il tipo double e' implementato in un modo in C, in un modo in java, in un altro in PHP.
se la rappresentazione del tipo fosse sempre la stessa, e cosi' fosse anche l'implementazione delle funzioni che ci lavorano sopra, avremmo 3 volte lo stesso linguaggio :)

Fractals87
20-01-2015, 13:21
bha non sono d'accordo (ignorantemente parlando).
due operazioni non possono restituire due risultati diversi.
Magari una può restituire più decimali piuttosto che un'altra.

Ma non restituire lo stesso numero di decimali con risultati diversi... questo sempre a cifre poco significative.
Ma in un contesto di calcolo più ampio genera errori.

Fractals87
20-01-2015, 13:24
e poi un numero a doppia precisione ha sempre 32 decimali di mantissa.
e tt i software devono restituire le 32 cifre in modo uguale.

poi una ci può mettere 1ms per fare operazione e l'altra 5... ma il risultato deve essere lo stesso.

Poi sicuramente ho torto... perchè ancora non ho capito il perchè di questo comportamente.

Però la logica mi suggerisce questo.

Loading