Ho un modello considerevole (~ 5000 righe) scritto in C. È un programma seriale, senza generazione casuale di numeri da nessuna parte. Fa uso della libreria FFTW per le funzioni che usano FFT - Non conosco i dettagli dell'implementazione di FFTW, ma presumo che anche le funzioni ivi contenute siano deterministiche (correggimi se sbaglio).
Il problema che non riesco a capire è che sto ottenendo piccole differenze nei risultati per esecuzioni identiche sulla stessa macchina (stesso compilatore, stesse librerie).
Uso variabili a doppia precisione e, ad value
esempio, per generare il risultato in variabile , rilascio:
fprintf(outFID, "%.15e\n", value);
o
fwrite(&value, 1, sizeof(double), outFID);
E
otterrei costantemente differenze come: 2.07843469652206 4 e-16 vs. 2.07843469652206 3 e-16
Ho trascorso molto tempo a cercare di capire perché. Inizialmente pensavo che uno dei miei chip di memoria fosse andato male, e li ho ordinati e sostituiti, senza risultato. Successivamente ho anche provato a eseguire il mio codice sulla macchina Linux di un collega e ho differenze della stessa natura.
Che cosa potrebbe causare questo? Ora è un piccolo problema, ma mi chiedo se sia la "punta dell'iceberg" (di un problema serio).
Ho pensato di pubblicare qui invece di StackOverflow nel caso in cui qualcuno che avesse lavorato con modelli numerici avesse riscontrato questo problema. Se qualcuno potesse far luce su questo, sarei molto grato.
Seguito dato ai commenti:
Christian Clason e Vikram: in primo luogo, grazie per l'attenzione alla mia domanda. Gli articoli che hai collegato suggeriscono che: 1. errori di arrotondamento limitano l'accuratezza e 2. codici diversi (come l'introduzione di istruzioni di stampa apparentemente innocue) possono influire sui risultati fino al epsilon della macchina. Dovrei chiarire che non sto confrontando gli effetti fwrite
e le fprintf
funzioni. Sto usando l'uno o l'altro. In particolare, lo stesso eseguibile viene utilizzato per entrambe le esecuzioni. Sto semplicemente affermando che il problema si verifica se utilizzo fprintf
OR fwrite
.
Quindi il percorso del codice (ed eseguibile) è lo stesso e l'hardware è lo stesso. Con tutti questi fattori esterni mantenuti costanti, da dove viene la casualità, fondamentalmente? Ho sospettato che il capovolgimento dei bit fosse dovuto al fatto che la memoria difettosa non si manteneva un po 'correttamente, motivo per cui ho sostituito i chip di memoria, ma questo non sembra essere il problema qui, ho verificato e hai indicato. Il mio programma emette migliaia di questi numeri a doppia precisione in una sola corsa e ci sono sempre una manciata casuale che ha lanci di bit casuali.
Seguito n. 2 :
questa è una trama delle serie temporali emesse dal modello, per facilitare la discussione degli spunti nei commenti.