Hello. When I run this code :
#include <cmath> // for NAN c++11 and up #include <iostream> #include <xmmintrin.h> int main(int argc, char ** argv) { float nan_value = NAN; __m128 const a = _mm_load_ss(&nan_value); __m128 const b = _mm_setzero_ps(); std::cout << "gt : "<< (nan_value > 0) << std::endl; std::cout << "lt : "<< (nan_value < 0) << std::endl; std::cout << "ge : "<< (nan_value >= 0) << std::endl; std::cout << "le : "<< (nan_value <= 0) << std::endl; std::cout << "eq : "<< (nan_value == 0) << std::endl; std::cout << "ne : "<< (nan_value != 0) << std::endl << std::endl << std::endl; std::cout << "ugt : "<< _mm_ucomigt_ss(a,b) << std::endl; std::cout << "ult : "<< _mm_ucomilt_ss(a,b) << std::endl; std::cout << "uge : "<< _mm_ucomige_ss(a,b) << std::endl; std::cout << "ule : "<< _mm_ucomile_ss(a,b) << std::endl; std::cout << "ueq : "<< _mm_ucomieq_ss(a,b) << std::endl; std::cout << "une : "<< _mm_ucomineq_ss(a,b) << std::endl << std::endl << std::endl; return 0; }
I get this output :
Which is weird because based on the documentation comigt/lt/ge/le/eq/neq should return 1 when one or both operands are NAN. Can someone shed some light on this?