Hesaplama sonuçlarının bit-bit-tekrar üretilebilirliğini elde etmeyi son derece zorlaştıran birçok teknik zorluk vardır.
Yazılım düzeyinde, kodda yapılan değişiklikler veya kod tarafından kullanılan kitaplıklardan herhangi biri açıkça farklı sonuçların üretilmesine neden olabilir. Tipik bir bilimsel koda bağlı olabilecek destek kütüphanelerinin sayısı sizi şaşırtacaktı.
Daha düşük bir düzeyde, kodun herhangi birini veya kod tarafından kullanılan kitaplıkların herhangi birini yeni bir derleyici veya farklı derleyici optimizasyonları açık olarak yeniden derlemek de sorunlara neden olabilir. Bunun bir nedeni, koddaki çeşitli işlemlerin kod yeniden derlendiğinde farklı bir sırada gerçekleştirilebilmesidir. Kayan nokta ilavesi ilişkisel (a + b) + c <> a + (b + c) olmadığından, bu farklı sonuçlar verebilir.
Tamam, bu yüzden (örneğin) kodu çalıştıracak bir önyüklenebilir CD-Rom'a yazarak tüm yazılım ortamını (işletim sistemi, kütüphaneler ve derlenmiş kod) korursak ne olur? Şimdi bu kodu farklı bir bilgisayarda çalıştırırsak aynı sonuçları alacağımızdan emin olabilir miyiz?
Şaşırtıcı bir şekilde, bazı kodlar hesaplamaların sırasını, üzerinde çalıştıkları belirli işlemci modelinin yönlerine göre değiştirir. Örneğin, optimize edilmiş lineer cebir kütüphaneleri genellikle önbellek içine sığacak bloklar üzerinde çalışmak için matris çarpımlarını parçalar. Intel, daha büyük bir önbelleğe sahip yeni bir mikroişlemci yayınladığında, kod blok boyutunu dinamik olarak ayarlayabilir ve bu da farklı bir sırada gerçekleştirilen ve farklı sonuçlar veren aritmetik ile sonuçlanabilir. Diğer kodlar, hesaplamaların sırasını, kullanılabilir bellek miktarına göre dinamik olarak ayarlar - eğer kodu aritmetiğin farklı bir sırada yapılmasına ve dolayısıyla farklı sonuçlar vermesine neden olabilecek daha fazla belleğe sahip bir bilgisayarda çalıştırırsanız.
Farklı iş parçacıklarının tam yürütme geçmişi genellikle belirleyici olmadığından ve bu da aritmetik işlemlerin bir işlemden diğerine farklı bir sırayla gerçekleştirilmesine neden olabileceğinden, çok iş parçacıklı kod attığınızda işler inanılmaz derecede karmaşıklaşır.
Pratikte gerçekten umabileceğiniz en çok şey, kullanılan algoritmaların doğruluk toleranslarına kadar, bir makineden diğerine benzer sonuçlardır. Örneğin, bir kök bulma problemim varsa ve + -1.0e-10 içinde bir kök elde etmek için ikiye ayırma kullanırsam, farklı makineler bu tolerans dahilinde cevaplar ürettiği sürece mutlu olmalıyım.