Confrontando qualche codice C e F # con cui sto cercando di sostituirlo, ho notato che c'erano alcune differenze nel risultato finale.Le doppie C sono diverse dai doppi .NET?
Ripercorrendo il codice, ho scoperto che anche in quel caso c'erano differenze, anche se minuscole.
Il codice inizia leggendo i dati da un file. e il primo numero esce in modo diverso. Per esempio, in F # (più facile da copione):
let a = 71.9497985840
printfn "%.20f" a
Ho l'aspettavo (a me) Uscita 71.94979858400000000000
.
Ma in C:
a = 71.9497985840;
fprintf (stderr, "%.20f\n", a);
stampe fuori 71.94979858400000700000
.
Da dove viene 7?
La differenza è solo piccola, ma mi dà fastidio perché non so perché. (Mi disturba anche perché rende più difficile rintracciare dove le mie due versioni di codice sono divergenti)
Sei sicuro che entrambi i valori sono doppi? Sei sicuro che l'errore non sia in stampa? – Euphoric
aritmetica in virgola mobile in .net non ha un risultato esatto ben definito. È solo un'approssimazione. Le cifre più basse possono cambiare in base al capriccio del compilatore e di JITer, e osservarle con qualcosa come 'printfn' può influenzarle. – CodesInChaos
Utilizzare un debugger o qualcosa per vedere il modello di bit esatto delle variabili. Se entrambe le implementazioni F # e C hanno lo stesso formato in virgola mobile e le variabili hanno lo stesso schema di bit, allora la differenza è o nella stampa o come il letterale in virgola mobile viene analizzato dal compilatore. In entrambi i casi, poiché i punti fluttuanti sono solo approssimazioni, potrebbe non essere nulla di cui preoccuparsi, poiché la differenza è piuttosto piccola. –