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
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.
Null veya boş toplama geri dönmek için...
Neden yerine HTML JSON oluşturulan dön...
Nasıl bir sonuç (startActivityForResul...
Bir dosyanın önceki bir SVN revizyon i...
Neden C# birbirleri ile iki nesne türl...