Ich habe ein großes Modell (~ 5000 Zeilen) in C geschrieben. Es ist ein serielles Programm, bei dem nirgendwo Zufallszahlen generiert werden. Es nutzt die FFTW-Bibliothek für Funktionen, die FFT verwenden. Ich kenne die Details der FFTW-Implementierung nicht, gehe jedoch davon aus, dass die darin enthaltenen Funktionen auch deterministisch sind (korrigieren Sie mich, wenn ich mich irre).
Das Problem, das ich nicht verstehen kann, ist, dass ich kleine Unterschiede in den Ergebnissen für identische Läufe auf demselben Computer (demselben Compiler, denselben Bibliotheken) erhalte.
Ich verwende Variablen mit doppelter Genauigkeit, und um das Ergebnis beispielsweise in Variablen auszugeben value
, gebe ich Folgendes aus:
fprintf(outFID, "%.15e\n", value);
oder
fwrite(&value, 1, sizeof(double), outFID);
Und ich würde ständig Unterschiede bekommen wie:
2.07843469652206 4 e-16 vs. 2.07843469652206 3 e-16
Ich habe viel Zeit damit verbracht herauszufinden, warum das so ist. Anfangs dachte ich, einer meiner Speicherchips sei defekt, und ich habe sie ohne Erfolg bestellt und ersetzt. Anschließend habe ich auch versucht, meinen Code auf dem Linux-Computer eines Kollegen auszuführen, und ich erhalte Unterschiede derselben Art.
Was könnte das verursachen? Es ist jetzt ein kleines Problem, aber ich frage mich, ob es die "Spitze des Eisbergs" ist (ein ernstes Problem).
Ich dachte, ich würde hier anstelle von StackOverflow posten, falls jemand, der mit numerischen Modellen arbeitet, auf dieses Problem stoßen könnte. Wenn jemand Licht ins Dunkel bringen kann, wäre ich sehr dankbar.
Follow-up zu Kommentaren:
Christian Clason und Vikram: Zunächst einmal vielen Dank für Ihre Aufmerksamkeit auf meine Frage. Die Artikel, auf die Sie verlinkt haben, schlagen Folgendes vor: 1. Rundungsfehler schränken die Genauigkeit ein und 2. Unterschiedlicher Code (z. B. das Einführen scheinbar harmloser Druckanweisungen) kann die Ergebnisse bis zum Maschinen-Epsilon beeinflussen. Ich sollte klarstellen, dass ich die Effekte fwrite
und fprintf
Funktionen nicht vergleiche . Ich benutze das eine oder das andere. Insbesondere wird für beide Läufe dieselbe ausführbare Datei verwendet. Ich sage nur, dass das Problem auftritt, ob ich fprintf
OR verwende fwrite
.
Der Codepfad (und die ausführbare Datei) sind also identisch, und die Hardware ist identisch. Woher kommt die Zufälligkeit bei all diesen konstanten externen Faktoren im Grunde genommen? Ich vermutete, dass der Bit-Flip passiert ist, weil der fehlerhafte Speicher ein bisschen nicht richtig beibehalten wurde, weshalb ich die Speicherchips ausgetauscht habe, aber das scheint hier nicht das Problem zu sein, habe ich überprüft und Sie haben angegeben. Mein Programm gibt Tausende dieser Zahlen mit doppelter Genauigkeit in einem einzigen Lauf aus, und es gibt immer eine zufällige Handvoll mit zufälligen Bitflips.
Follow-up Nr. 2 :
Dies ist eine grafische Darstellung der vom Modell ausgegebenen Zeitreihen, um die Ablegerdiskussion in den Kommentaren zu unterstützen.