C ile yazılmış büyük bir model (~ 5000 satır) var. Hiçbir yerde rastgele sayı üretimi ile seri bir programdır. FFTW işlevlerini FFTW kullanan işlevler için kullanır - FFTW uygulamasının ayrıntılarını bilmiyorum, ancak buradaki işlevlerin de deterministik olduğunu varsayıyorum (hata yapıyorsam beni düzelt).
Anlayamadığım sorun, aynı makinede (aynı derleyici, aynı kütüphaneler) aynı çalışmaların sonuçlarında küçük farklılıklar alıyorum.
Çift duyarlıklı değişkenler kullanıyorum ve sonucu değişken olarak çıktılamak value
için örneğin, sorun:
fprintf(outFID, "%.15e\n", value);
veya
fwrite(&value, 1, sizeof(double), outFID);
Ve sürekli olarak şu gibi farklılıklar elde
edeceğim : 2.07843469652206 4 e-16 vs. 2.07843469652206 3 e-16
Bunun nedenini anlamaya çalışmak için çok zaman harcadım. Başlangıçta bellek yongalarımdan birinin kötüye gittiğini düşündüm ve boşuna sipariş ettim ve değiştirdim. Daha sonra kodumu bir iş arkadaşının Linux makinesinde çalıştırmayı denedim ve aynı nitelikte farklılıklar elde ediyorum.
Buna ne sebep olabilir? Şimdi küçük bir sorun, ama merak ediyorum (ciddi bir sorunun) "buzdağının ucu".
Sayısal modellerle çalışan birisinin bu sorunla karşılaşması durumunda StackOverflow yerine buraya yazacağımı düşündüm. Eğer birisi buna ışık tutabilirse, çok fazla yükümlü olurdum.
Yorumların
takibi : Christian Clason ve Vikram: ilk olarak soruma gösterdiğiniz ilgi için teşekkür ederim. Aşağıdakileri önermek için bağladığınız makaleler: 1. yuvarlama hataları doğruluğu sınırlar ve 2. farklı kod (görünüşte zararsız yazdırma ifadeleri eklemek gibi) makine epsilonuna kadar sonuçları etkileyebilir. Etkileri fwrite
ve fprintf
fonksiyonları kıyaslamadığımı açıklığa kavuşturmalıyım . Birini VEYA diğerini kullanıyorum. Özellikle, her iki çalıştırma için de aynı yürütülebilir dosya kullanılır. Ben fprintf
OR kullanmak ister sadece sorunu olduğunu belirten fwrite
.
Dolayısıyla kod yolu (ve yürütülebilir) aynıdır ve donanım aynıdır. Tüm bu dış faktörler sabit tutulurken, rastgelelik esasen nereden geliyor? Arızalı hafızanın biraz doğru tutulmaması nedeniyle biraz çevirme olduğundan şüphelendim, bu yüzden bellek yongalarını değiştirdim, ancak buradaki sorun gibi görünmüyor, doğruladım ve siz belirttiniz. Programım, bu çift kesinlikli sayıların binlerceini tek bir çalışmada çıkarır ve her zaman rastgele bit döndürmeleri olan rastgele bir avuç vardır.
Christian Clason ilk yorumuna İzleyen: Neden makine hassasiyet içinde 0 ile aynıdır? Bir çift için en küçük pozitif sayı 2.22e-308'dir, bu yüzden 0'a eşit olmamalıdır? Programım 10 ^ -16 aralığında (1e-15 ila 8e-17 arasında) binlerce değer çıktı ve araştırma projemizde anlamlı varyasyonlar görüyoruz, bu yüzden umarım saçma sapan bakmıyoruz sayılar.
Takip # 2 :
Bu, yorumlardaki offshoot tartışmasına yardımcı olmak için model tarafından üretilen zaman serisi çıktısının bir grafiğidir.