SORU
18 ŞUBAT 2015, ÇARŞAMBA


Neden kayan nokta sonsuz, NaNs aksine, eşit?

Neden mi sonsuz karşılaştırma mantığı NaNs uygulanan takip etmiyor? Bu kod false üç kez çıktı:"

double a = Double.NaN;
double b = Double.NaN;
System.out.println(a == b); // false
System.out.println(a < b); //  false
System.out.println(a > b); //  false

Eğer Double.POSITIVE_INFINITY Double.NaN değiştirirsem ancak, eşitlik için true anlıyorum, ama daha fazla-daha az-daha karşılaştırmaları için false:

double a = Double.POSITIVE_INFINITY;
double b = Double.POSITIVE_INFINITY;
System.out.println(a == b); // true
System.out.println(a < b); //  false
System.out.println(a > b); //  false

Bu tehlikeli görünüyor. Sonsuz değerler taşması sonucu varsayarak, sonsuz olarak sona erdi Bu iki değişken aslında mükemmel aritmetik eşit olmaz ki daha olası olduğunu düşünüyorum.

CEVAP
18 ŞUBAT 2015, ÇARŞAMBA


Senin muhakeme Double.POSITIVE_INFINITY “doğruluk. kaybı sonucu elde edilmiş” büyük olasılıkla çünkü kendisi eşit olması gerektiğidir

Bu muhakeme, kayan nokta için geçerlidir. Herhangi bir sonlu değer yanlış bir işlem sonucu elde edilebilir. IEEE 754 standardizasyon Komitesi her zaman sonlu değerleri için yanlış değerlendirilmesi == tanımlamak için itme vermedi, bu yüzden sonsuz neden farklı olsun ki?

, == ne yaptığını anlayan insanlar (için yararlı olarak tanımlanır ^strong>elde edilmiş bir kayan nokta değerleri testve kesinlikle gerçek hesaplamaları ile elde edilmiş değerler değil). İsteyen kim, anlayan ve anlamak gerekir bunu kullanmak kayan nokta bile hesaplamaları yapmak yapılmayan sonsuz olması Double.POSITIVE_INFINITY == Double.POSITIVE_INFINITY değerlendirmek doğru mu uygun, yoksa sadece test kayan noktalı sonucu bir kayan nokta hesaplama Double.POSITIVE_INFINITY.

Bu NaN özel davranış için gelemez neden soru bırakır ve sonsuz sonlu değerleri aynı genel ilkelere uygun olmalıdır. NaN farklıdır sonsuz: temel prensip IEEE 754 standardı olan değerler tam olarak ne olduklarını, ama sonuç bir operasyon olabilir yaklaşık ile ilgili gerçek sonuç ve bu durumda, ortaya çıkan bir kayan nokta değeri elde etmek göre yuvarlama modu.

1.0 / 0.0 bu tartışma bir sıkıntı olan ınf, olarak tanımlanan bir an için unutun. 1.0e100 / 1.0e-300 Double.MAX_VALUE Double.MAX_VALUE gibi işlemler sonucu Double.POSITIVE_INFINITY şu an için sadece düşünüyorum. Bu işlemler için, ınf gerçek sonuç en yakın benzetme, gibi sonlu bir sonuç işlemleri için. Buna karşılık, NaN operasyon mantıklı değil ne zaman elde ettiğimiz sonuç. Savunulabilir NaN özel olarak davranır, ama ınf tüm değerleri temsil etmek için çok büyük bir yaklaşım.

, 1.0 / 0.0 de ınf üretir, ama gerçekbubir istisna olarak kabul edilmelidir. Sadece tutarlı NaN bu işlemin sonucu tanımlamak için olurdu, ama ınf olarak tanımlayan bazı algoritmalar uygulanması daha kolay oldu. Örnek Kahan's notes 10 sayfa verilmiştir. Çoğu için keşke daha fazla ayrıntı article “Branch Cuts for Complex Elementary Functions, or Much Ado About Nothing's Sign Bit”. Ben de yorumlamak varlığına IEEE 754 bir “sıfıra bölme” bayrak ayrı NaN bayrak tanınması kullanıcı de tedavi Bölümü tarafından özel olarak sıfır olsa da olmasa tanımlanan üreten NaN.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • MaximumPCMag

    MaximumPCMag

    23 Temmuz 2010
  • MkElite

    MkElite

    13 NİSAN 2012
  • MrExcite96

    MrExcite96

    17 ŞUBAT 2011