Şamandıra arasındaki fark ve çift
Ben çift hassas ve tek duyarlıklı, vb arasındaki fark hakkında bir şeyler okumuştum. Ama çoğu zaman aynı sonuçları vermesi gerekir?
Ben bir sorunu çözme konusunda bir programlama yarışması ve Hesaplamalar kayan nokta sayı bu değildi gerçekten büyük, bu yüzden karar verdim kullanın kayan nokta yerine çift ve kontrol ettim - ben almak doğru sonuçlar. Ama ben bir çözüm gönderirken, sadece 1 10 testleri doğru olduğunu söyledi. Şamandıra kullanarak aynı kullanarak çift olduğunu bulana kadar tekrar tekrar kontrol ettim. Çift hesaplamalar için koydum ve çıkış için çift ve programı AYNI sonuçları verdi, ama bu kez 10 testleri doğru geçti.
Ben, çıkış AYNI, sonuçlar AYNI idi, ama şamandıra koyarak - tek çift işe yaramadı tekrarlayın. Değerleri çok büyük de değildi, hem de program kaydır ve çift ile aynı testlerde aynı sonuçları verdi, ama online hakim çift sağlanan tek çözüm kabul etti.
Neden? Fark nedir?
CEVAP
Çok büyük bir fark.
Adından da anlaşılacağı gibi, bir double
2x float
hassas[1]. Genel bir çift float
7 varken duyarlık 15 16 ondalık basamak vardır.
Bu hassasiyet kaybı kesme hataları için yukarı / aşağı için çok daha kolay, örneğin neden olabilir
float a = 1.f / 81;
float b = 0;
for (int i = 0; i < 729; i)
b = a;
printf("%.7g\n", b); // prints 9.000023
süre
double a = 1.0 / 81;
double b = 0;
for (int i = 0; i < 729; i)
b = a;
printf("%.15g\n", b); // prints 8.99999999999996
Ayrıca, en büyük değer şamandıra sadece 3e38
, ama çift hakkında 1.7e308
kullanarak float
vurabilecek Sonsuzluk çok daha kolay çift için basit bir şey örneğin bilgisayar 60!.
Bence test kendi halinde programın başarısız olmasına neden olan bu büyük sayılar içerir.
Elbette bazen double
yeterince doğru olmasa bile, dolayısıyla long double
[1](yukarıdaki örnek verir 9.000000000000000066 Mac), ama bütün bu kayan nokta türleri muzdarip yuvarlama hataları, eğer hassasiyet çok önemli (örn: para işleme) kullanmalısın int
veya bir kısmını sınıf.
BTW, hataları hızlı bir şekilde biriktikçe =
kayan noktalı sayılar bir sürü toplamak için kullanmayın. Eğer Python kullanıyorsanız, fsum
kullanın. Aksi takdirde, Kahan summation algorithm uygulamak için deneyin.
[1]: C ve C standartları float
, double
long double
temsili belirtin. Her üç IEEE çift hassasiyetli uygulanması mümkündür. Yine de, en mimarileri için (; x 86, x 64, ARM gcc, MSVC) 18**gerçekten bir IEEE tek duyarlıklı kayan nokta sayısı (binary32) ve double
IEEE çift duyarlıklı kayan nokta sayısı (binary64).
Ondalık arasındaki fark, ve içinde Yüz...
Açısal JS çift ve tek kaşlı arasındaki...
Sayısal,şamandıra arasındaki fark ve s...
Tek Yönlü ve çift Yönlü dernekler aras...
SQL içinde, tek ve çift tırnak arasınd...