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

  • AmazonWireless

    AmazonWirele

    8 EYLÜL 2010
  • ASUS Campus Life

    ASUS Campus

    18 Mart 2013
  • Photoshop Training Channel

    Photoshop Tr

    13 Temmuz 2012