SORU
24 AĞUSTOS 2012, Cuma


Sıfıra yakın yüzen bir değer-böl-sıfır hata neden olabilir?

Herkes yüzer doğrudan karşılaştırmak için, daha ziyade bir hoşgörü gerekiyor kullanmadığınız bilir:

float a,b;
float epsilon = 1e-6f;
bool equal = (fabs(a-b) < epsilon);

Eğer aynı bölümü kullanmadan önce sıfır bir değer karşılaştırılması için geçerli olup olmadığını merak ediyordum.

float a, b;
if (a != 0.0f) b = 1/a; // oops?

Bu durumda da epsilon ile karşılaştırmak gerek var mı?

CEVAP
24 AĞUSTOS 2012, Cuma


Sıfır Noktası bölünmesi yüzen bir hata değildir. Harekete geçiren bir kayan nokta özel durumu (no-op olduğun sürece aktif olarak kontrol ediyorum onları) uygulamaları destek kayan nokta özel ve iyi tanımlanmış sonuç: pozitif ya da negatif sonsuz (eğer pay ise sıfır olmayan) veya NAN (eğer pay sıfır).

Aynı zamanda sonsuz (ve taşma özel durumu) payda sıfır ama sıfır (gibi) normalin altında çok yakın olduğunda sonuç olarak, tekrar etmek gerekirse, bu bir hata değildir. Ne kadar kayan çalışıyor.

Düzenleme:Unutmayın, Eric dikkat çeken açıklamalarda, bu cevap varsayar şartları Ek-F, isteğe bağlı bir parçası C standart ayrıntılı kayan nokta davranış ve hizalama ile standart IEEE kayan nokta. Yokluğunda IEEE aritmetik, C tanımlamıyor kayan nokta birimi tarafından sıfır (ve aslında, tüm sonuçları kayan nokta işlemleri uygulama tanımlı olabilir tanımlandığı gibi tam bir saçmalık ve hala uymak için C standart), eğer karşınıza alıyorsunuz bir tuhaf C uygulama yok onur IEEE kayan nokta, bakın belgelere uygulanması için kullanıyorsun için bu soruya cevap.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ChannelRichard

    ChannelRicha

    7 Kasım 2008
  • NikkoNantone

    NikkoNantone

    21 Kasım 2011
  • The Bad Tutorials

    The Bad Tuto

    6 EKİM 2009