SORU
4 Aralık 2012, Salı


Karşılaştırma epsilon kullanarak sıfır çift

Bugün, bazı C kodu (başkası tarafından yazılmış) bakarak ve bu bölümü buldum

double someValue = ...
if (someValue <  std::numeric_limits<double>::epsilon() && 
    someValue > -std::numeric_limits<double>::epsilon()) {
  someValue = 0.0;
}

Bu bile mantıklı olup olmadığını anlamaya çalışıyorum.

epsilon() belgelerine diyor ki:

İşlevi temsil edilebilir olduğunu ve en küçük değeri 1'den büyük 1 arasındaki fark [bir çift] verir.

Bu 0 için de geçerli, yani 7 ** en küçük değer 0'dan büyük yapar mı? Veya double tarafından temsil edilebilir 0 0 epsilon arasında bir sayı var mı?

O zaman karşılaştırma someValue == 0.0 eşdeğer değil mi?

CEVAP
4 Aralık 2012, Salı


64-bit IEEE çift varsayarsak, 52 bit mantis ve 11-bit bir üs var. Şu rakamlara bak:

1.0000 00000000 00000000 00000000 00000000 00000000 00000000 × 2^0 = 1

Temsil edilebilir en küçük Sayı 1'den büyük:

1.0000 00000000 00000000 00000000 00000000 00000000 00000001 × 2^0 = 1   2^-52

Bu nedenle:

epsilon = (1   2^-52) - 1 = 2^-52

0 ile epsilon arasında herhangi bir sayı var mı? ... E. bol g. en az olumlu gösterilebilir (normal) numarası:

1.0000 00000000 00000000 00000000 00000000 00000000 00000000 × 2^-1022 = 2^-1022

Aslında tüm pozitif gösterilebilir sayıları G olan epsilon, 0 arasında (1022 - 52 1)×2^52 = 4372995238176751616 sayılar hakkında

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • L- Crysis

    L- Crysis

    30 Aralık 2011
  • Photoshop Tutorials

    Photoshop Tu

    22 HAZİRAN 2011
  • Tina Chen

    Tina Chen

    26 Mayıs 2012