Ada banyak tantangan teknis yang membuat reproduktifitas bit-for-bit hasil komputasi yang tepat sangat sulit untuk dicapai.
Pada tingkat perangkat lunak, perubahan pada kode atau perpustakaan apa pun yang digunakan oleh kode jelas dapat menyebabkan hasil yang berbeda. Anda akan terkejut dengan jumlah pustaka dukungan yang akhirnya dapat dihubungkan dengan kode ilmiah tipikal.
Pada tingkat yang lebih rendah, kompilasi ulang salah satu kode atau perpustakaan yang digunakan oleh kode dengan kompiler baru atau dengan optimisasi kompiler yang berbeda dihidupkan juga dapat menyebabkan masalah. Salah satu alasannya adalah bahwa berbagai operasi dalam kode dapat dilakukan dalam urutan yang berbeda ketika kode tersebut dikompilasi ulang. Karena penambahan floating point tidak asosiatif (a + b) + c <> a + (b + c), ini dapat memberikan hasil yang berbeda.
OK, jadi bagaimana jika kita menjaga seluruh lingkungan perangkat lunak (OS, perpustakaan, dan kode yang dikompilasi) dengan (misalnya) membakarnya ke CD-Rom bootable yang akan menjalankan kode. Sekarang bisakah kita memastikan bahwa kita akan mendapatkan hasil yang sama jika kita menjalankan kode ini di komputer lain?
Anehnya, beberapa kode sebenarnya memvariasikan urutan perhitungan berdasarkan aspek-aspek model prosesor tertentu yang mereka jalankan. Misalnya, pustaka aljabar linier yang dioptimalkan biasanya memecah perkalian matriks untuk bekerja pada blok yang akan masuk ke dalam cache. Ketika Intel merilis mikroprosesor baru dengan cache yang lebih besar, kode mungkin secara dinamis menyesuaikan ukuran blok, menghasilkan aritmatika yang dilakukan dalam urutan yang berbeda dan memberikan hasil yang berbeda. Kode lain secara dinamis menyesuaikan urutan perhitungan berdasarkan jumlah memori yang tersedia - jika Anda menjalankan kode pada komputer dengan lebih banyak memori yang dapat menyebabkan aritmatika dilakukan dalam urutan yang berbeda dan dengan demikian memberikan hasil yang berbeda.
Banyak hal menjadi lebih rumit ketika Anda memasukkan kode multithreaded, karena riwayat eksekusi yang tepat dari utas yang berbeda sering kali tidak deterministik dan ini lagi-lagi dapat menyebabkan operasi aritmatika dilakukan dalam urutan yang berbeda dari satu putaran ke putaran berikutnya.
Dalam praktiknya, yang paling bisa Anda harapkan adalah hasil yang serupa dari satu mesin ke mesin lain, hingga toleransi akurasi dari algoritma yang digunakan. misalnya jika saya memiliki masalah pencarian root dan menggunakan pembagian dua untuk mendapatkan root dalam + -1.0e-10, maka saya harus senang selama mesin yang berbeda menghasilkan jawaban yang setuju dalam toleransi itu.