Используя объединение, могу ли я сравнить два двойных числа через unsigned int?
Имея следующие союзы:
union {double first_d; uint64 first;};
union {double second_d; uint64 second;};
...
first_d = <a double value>
second_d = <a double value>
Имеет ли вывод следующие сравнения:
if(first_d > second_d)
// CASE 1 OUTPUT
else if(first_d < second_d)
// CASE 2 OUTPUT
else
// CASE 3 OUTPUT
всегда одинаково для следующего?
if(first> second)
// CASE 1' OUTPUT
else if(first < second)
// CASE 2' OUTPUT
else
// CASE 3' OUTPUT
1 ответ
Решение
Нету. Вот контрпример с использованием NaNs
:
int main()
{
union {double first_d; uint64 first;};
union {double second_d; uint64 second;};
first = 0x7ff8000000000001;
second = 0x7ff8000000000002;
if(first_d > second_d)
printf("greater\n");
else if(first_d < second_d)
printf("less\n");
else
printf("other\n");
if(first > second)
printf("greater\n");
else if(first < second)
printf("less\n");
else
printf("other\n");
return 0;
}
Выход:
other
less
Я также упомяну, что наказание типов через профсоюзы не соответствует стандартам на 100%. Таким образом, вы также можете сказать, что это неопределенное поведение.