Saya memiliki model yang cukup besar (~ 5000 baris) ditulis dalam C. Ini adalah program serial, tanpa generasi nomor acak di mana pun. Itu menggunakan perpustakaan FFTW untuk fungsi menggunakan FFT - Saya tidak tahu detail implementasi FFTW, tapi saya menganggap fungsi di dalamnya juga deterministik (koreksi saya jika saya salah).
Masalah yang saya tidak mengerti adalah bahwa saya mendapatkan perbedaan kecil dalam hasil untuk menjalankan identik pada mesin yang sama (kompiler yang sama, perpustakaan yang sama).
Saya menggunakan variabel presisi ganda, dan untuk menampilkan hasilnya dalam variabel value
misalnya, saya menerbitkan:
fprintf(outFID, "%.15e\n", value);
atau
fwrite(&value, 1, sizeof(double), outFID);
Dan saya akan selalu mendapatkan perbedaan seperti:
2.07843469652206 4 e-16 vs 2.07843469652206 3 e-16
Saya telah menghabiskan banyak waktu untuk mencari tahu mengapa ini terjadi. Awalnya saya pikir salah satu chip memori saya sudah rusak, dan saya sudah memesan dan menggantinya, tetapi tidak berhasil. Saya kemudian juga mencoba menjalankan kode saya pada mesin Linux seorang kolega, dan saya mendapatkan perbedaan dari sifat yang sama.
Apa yang menyebabkan ini? Ini adalah masalah kecil sekarang, tapi saya ingin tahu apakah itu adalah "puncak gunung es" (masalah serius).
Saya pikir saya akan memposting di sini daripada StackOverflow jika seseorang bekerja dengan model numerik mungkin menemukan masalah ini. Jika ada yang bisa menjelaskan ini, saya akan sangat berterima kasih.
Tindak lanjut komentar:
Christian Clason dan Vikram: pertama, terima kasih atas perhatian Anda pada pertanyaan saya. Artikel yang Anda tautkan menyarankan bahwa: 1. kesalahan pembulatan membatasi keakuratan, dan 2. kode yang berbeda (seperti memperkenalkan pernyataan cetak yang tampaknya tidak berbahaya) dapat memengaruhi hasil hingga epsilon mesin. Saya harus mengklarifikasi bahwa saya tidak membandingkan efek fwrite
dan fprintf
fungsi. Saya menggunakan satu ATAU yang lainnya. Secara khusus, executable yang sama digunakan untuk kedua run. Saya hanya menyatakan masalah terjadi apakah saya menggunakan fprintf
OR fwrite
.
Jadi jalur kode (dan dapat dieksekusi) adalah sama, dan perangkat kerasnya sama. Dengan semua faktor eksternal ini tetap konstan, dari mana asal keacakan, secara fundamental? Saya menduga bit flip terjadi karena memori yang salah tidak mempertahankan sedikit dengan benar, itulah sebabnya saya mengganti chip memori, tetapi itu tampaknya tidak menjadi masalah di sini, saya memverifikasi dan Anda menunjukkan. Program saya menghasilkan ribuan angka presisi ganda ini dalam sekali jalan, dan selalu ada beberapa acak yang memiliki bit bit acak.
Tindak lanjuti komentar pertama Christian Clason: Mengapa sama dengan 0 dalam presisi mesin? Angka positif terkecil untuk ganda adalah 2.22e-308, jadi bukankah seharusnya sama dengan 0? Program saya menghasilkan ribuan nilai dalam kisaran 10 ^ -16 (mulai dari 1e-15 hingga 8e-17) dan kami telah melihat variasi yang berarti dalam proyek penelitian kami, jadi saya harap kami tidak melihat omong kosong angka.
Tindak lanjut # 2 :
Ini adalah plot output seri waktu oleh model, untuk membantu dalam diskusi cabang di komentar.