Используя объединение, могу ли я сравнить два двойных числа через 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%. Таким образом, вы также можете сказать, что это неопределенное поведение.

Другие вопросы по тегам