#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
union foo
{
int32_t i;
float f;
};
void compare (const union foo * lo,
const union foo * hi)
{
bool success = (lo->f) < (hi->f);
if (!success)
printf ("lo:%x:%f hi:%x:%f\n", lo
->i
, lo
->f
, hi
->i
, hi
->f
); }
bool is_special_case (int32_t value)
{
static const int32_t special = (int32_t)0xFF << 23;
return (value & special) == special;
}
int main(void)
{
for (int32_t i = 0; i < INT32_MAX - 1; ++i)
{
bool special = is_special_case (i);
if (special)
continue;
union foo lo = {.i = i};
union foo hi = {.i = i + 1};
compare (&lo, &hi);
}
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRpbnQuaD4KI2luY2x1ZGUgPHN0ZGJvb2wuaD4KCgp1bmlvbiBmb28KewogICAgaW50MzJfdCBpOwogICAgZmxvYXQgZjsKfTsKCgp2b2lkIGNvbXBhcmUgKGNvbnN0IHVuaW9uIGZvbyAqIGxvLAogICAgICAgICAgICAgIGNvbnN0IHVuaW9uIGZvbyAqIGhpKQp7Cglib29sIHN1Y2Nlc3MgPSAobG8tPmYpIDwgKGhpLT5mKTsKCWlmICghc3VjY2VzcykKCQlwcmludGYgKCJsbzoleDolZiBoaToleDolZlxuIiwgbG8tPmksIGxvLT5mLCBoaS0+aSwgaGktPmYpOwp9CgoKYm9vbCBpc19zcGVjaWFsX2Nhc2UgKGludDMyX3QgdmFsdWUpCnsKCXN0YXRpYyBjb25zdCBpbnQzMl90IHNwZWNpYWwgPSAoaW50MzJfdCkweEZGIDw8IDIzOwoJcmV0dXJuICh2YWx1ZSAmIHNwZWNpYWwpID09IHNwZWNpYWw7Cn0KCgppbnQgbWFpbih2b2lkKQp7CgoJZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgSU5UMzJfTUFYIC0gMTsgKytpKQoJewoJCWJvb2wgc3BlY2lhbCA9IGlzX3NwZWNpYWxfY2FzZSAoaSk7CgkJaWYgKHNwZWNpYWwpCgkJCWNvbnRpbnVlOwoJCQkKCQl1bmlvbiBmb28gbG8gPSB7LmkgPSBpfTsKCQl1bmlvbiBmb28gaGkgPSB7LmkgPSBpICsgMX07CgkJCgkJY29tcGFyZSAoJmxvLCAmaGkpOwoJfQoJCn0K