Dün ben bir kayan noktalı aritmetik doğruluğunu kaybetme nedeni ile ilgili question istedi. X87 kayıtlarında tutulan ara sonuçlardan nasıl kaynaklandığına dair bir cevap aldım. Bu yardımcı oldu ama bazı detaylar hala kaçıyor. Bir önceki soruda sunduğum programın bir varyasyonu, debug modunda VC++ 2010 Express kullanıyorum.Yüzer nokta doğruluğu tekrar
int main()
{
double x = 1.8939201459282359e-308; /* subnormal number */
double tiny = 4.9406564584124654e-324; /* smallest IEEE double */
double scale = 1.6;
double temp = scale*tiny;
printf("%23.16e\n", x + temp);
printf("%23.16e\n", x + scale*tiny);
}
Bu ilk değer, IEEE standardına göre doğru
1.8939201459282369e-308
1.8939201459282364e-308
verir. scale
değişkeninin 2.0 değerini vermesi, her iki hesaplama için de doğru değeri verir. İlk hesaplamada temp
'un normal olmayan bir değer olduğunu ve dolayısıyla hassasiyeti kaybettiğini anlıyorum. Ayrıca, scale*tiny
'un değerinin, daha büyük bir üs aralığı olan bir x87 registerında tutulduğunu ve bu değerin temp
'dan daha hassas olduğunu anlıyorum. Anlamadığım şey, değeri x
'a eklerken, düşük hassasiyet değerinden doğru cevabı almamızdır. Şüphesiz daha düşük bir doğruluk değeri doğru cevabı verebiliyorsa, daha yüksek bir doğruluk değeri de doğru cevabı vermelidir? Bu 'çift yuvarlama' ile ilgisi var mı?
Şimdiden teşekkürler, bu benim için yepyeni bir konu, bu yüzden biraz mücadele ediyorum.
Aşağıdakiler doğru olabilir ama benim için hiç de açık değil: * Doğru bir yanıt verebiliyorsa daha doğru bir doğruluk değeri verilebiliyorsa, daha yüksek bir doğruluk değeri de doğru cevap vermelidir? * – NPE
Bu hesaplamalarda 'uzun çifte' kullanırdım ... –
Düşük hassasiyet sayısının son basamağında rastgele bir değere sahip olmadığını nasıl anlarız? Beklenene her zaman% 10'luk bir şans verilir. –