SORU
13 Mayıs 2014, Salı


C/C < ne neden olur;, <= ve == true argümanı NaN ise geri dönmek için operatörler?

Benim anladığım kuralları IEEE-754 kayan nokta karşılaştırma tüm karşılaştırma operatörleri hariç != false döndürür, eğer ikisinden biri veya her ikisi argümanlar NaN, != operatörüne doğru dönün. Kolayca tek başına kolay bir test ile bu davranışı yeniden oluşturmak istiyorum

for (int ii = 0; ii < 4;   ii)
{
    float a = (ii & 1) != 0 ? NAN : 1.0f;
    float b = (ii & 2) != 0 ? NAN : 2.0f;
    #define TEST(OP) printf("%4.1f %2s %4.1f => %s\n", a, #OP, b, a OP b ? "true" : "false");
    TEST(<)
    TEST(>)
    TEST(<=)
    TEST(>=)
    TEST(==)
    TEST(!=)
}

Bu beklenen sonuçları yazdırır: (NaN MSVC çalışma zamanı -1.$ biçimlendirilmiş)

 1.0  <  2.0 => true
 1.0  >  2.0 => false
 1.0 <=  2.0 => true
 1.0 >=  2.0 => false
 1.0 ==  2.0 => false
 1.0 !=  2.0 => true
-1.$  <  2.0 => false
-1.$  >  2.0 => false
-1.$ <=  2.0 => false
-1.$ >=  2.0 => false
-1.$ ==  2.0 => false
-1.$ !=  2.0 => true
 1.0  < -1.$ => false
 1.0  > -1.$ => false
 1.0 <= -1.$ => false
 1.0 >= -1.$ => false
 1.0 == -1.$ => false
 1.0 != -1.$ => true
-1.$  < -1.$ => false
-1.$  > -1.$ => false
-1.$ <= -1.$ => false
-1.$ >= -1.$ => false
-1.$ == -1.$ => false
-1.$ != -1.$ => true

Bu kod grubunu aşağı benim uygulamanın kayan noktalı tüm hesaplamaların yapıldığı iç döngüler, derinliklerinde yapıştırmak, ancak bu açıklanamaz sonuçlar alıyorum:

 1.0  <  2.0 => true
 1.0  >  2.0 => false
 1.0 <=  2.0 => true
 1.0 >=  2.0 => false
 1.0 ==  2.0 => false
 1.0 !=  2.0 => true
-1.$  <  2.0 => true
-1.$  >  2.0 => false
-1.$ <=  2.0 => true
-1.$ >=  2.0 => false
-1.$ ==  2.0 => true
-1.$ !=  2.0 => false
 1.0  < -1.$ => true
 1.0  > -1.$ => false
 1.0 <= -1.$ => true
 1.0 >= -1.$ => false
 1.0 == -1.$ => true
 1.0 != -1.$ => false
-1.$  < -1.$ => true
-1.$  > -1.$ => false
-1.$ <= -1.$ => true
-1.$ >= -1.$ => false
-1.$ == -1.$ => true
-1.$ != -1.$ => false

Nedense,*,* 10*,* 9 == operatörler ya da bağımsız NaN, beklenmedik biçimde doğru dönüyor. Ayrıca, != operatör beklenmedik bir şekilde yanlış veriyor.

Bu 64-bit kod, Visual Studio ile oluşturulan 2010, Intel Xeon E5-2650 üzerinde çalışıyor. _mm_getcsr(), ben kullanarak KSS kayıt her iki senaryo da aynı değeri tutan doğruladı.

Başka böyle bir kayan nokta matematik davranışlarına etkisi ne olabilir?

CEVAP
13 Mayıs 2014, Salı


Bu davranış, daha hızlı kod üretmek için bir çaba içinde derleyici uygun NaN davranış bakılmaksızın karşılaştırmaları yapmak için izin veren /fp:fast MSVC derleyici seçeneği, kaynaklanmaktadır. Bunun yerine /fp:precise /fp:strict kullanarak NaN argümanlar ile sunulan beklendiği gibi bu karşılaştırmalar davranmasına neden olur.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 30GB

    30GB

    14 AĞUSTOS 2006
  • Felice Musique

    Felice Musiq

    22 NİSAN 2014
  • Samantha Crain

    Samantha Cra

    30 EKİM 2008