SORU
5 Mart 2010, Cuma


Ş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
5 Mart 2010, Cuma


Ç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 doubleIEEE çift duyarlıklı kayan nokta sayısı (binary64).

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Adam Khoury

    Adam Khoury

    23 Ocak 2008
  • Jesse Pimenta

    Jesse Piment

    5 EKİM 2011
  • SolidWorksTutoriels

    SolidWorksTu

    14 Kasım 2013