#include <stdio.h>
#include <inttypes.h>
#pragma pack(push, 1)
typedef union{
double d;
uint64_t ui;
} Unskiloza;
#pragma pack(pop)
int main() {
Unskiloza x, y;
x.d = 4.0000000000000;
y.d = 3.9999999999999;
printf("x.ui = %#llx\n", x.
ui); printf("y.ui = %#llx\n", y.
ui); printf("x.ui - y.ui = %lld\n", (x.
ui-y.
ui) & 0x7FFFFFFFFFFFF000L
); // 0 printf("x.ui - y.ui = %lld\n", (x.
ui-y.
ui) ); // 225 printf("x - y = %0.2e\n", x.
d - y.
d); // 1.00e-013 printf( 0== ((x.
ui-y.
ui) & 0x7FFFFFFFFFFF0000L
) ? "is nearly equals" : "not equals at all" );
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxpbnR0eXBlcy5oPgoKI3ByYWdtYSBwYWNrKHB1c2gsIDEpCnR5cGVkZWYgdW5pb257CiAgICAgICAgZG91YmxlICAgICBkOwogICAgICAgIHVpbnQ2NF90IHVpOwkgICAgCn0gVW5za2lsb3phOwojcHJhZ21hIHBhY2socG9wKQoKCmludCBtYWluKCkgewogIFVuc2tpbG96YSB4LCB5OwogIHguZCA9IDQuMDAwMDAwMDAwMDAwMDsKICB5LmQgPSAzLjk5OTk5OTk5OTk5OTk7CgogIHByaW50ZigieC51aSA9ICAlI2xseFxuIiwgeC51aSk7CiAgcHJpbnRmKCJ5LnVpID0gICUjbGx4XG4iLCB5LnVpKTsKICBwcmludGYoIngudWkgLSB5LnVpID0gICVsbGRcbiIsICh4LnVpLXkudWkpICYgMHg3RkZGRkZGRkZGRkZGMDAwTCk7ICAvLyAwCiAgcHJpbnRmKCJ4LnVpIC0geS51aSA9ICAlbGxkXG4iLCAoeC51aS15LnVpKSApOyAgLy8gMjI1CiAgcHJpbnRmKCJ4IC0geSA9ICAlMC4yZVxuIiwgeC5kIC0geS5kKTsgICAgICAgICAvLyAxLjAwZS0wMTMKICBwcmludGYoIDA9PSAoKHgudWkteS51aSkgJiAweDdGRkZGRkZGRkZGRjAwMDBMKSA/ICJpcyBuZWFybHkgZXF1YWxzIiA6ICJub3QgZXF1YWxzIGF0IGFsbCIgKTsKCiAgcmV0dXJuIDA7Cn0=