#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 = 40000000000000;
y.d = 39999999999999;
printf("x.ui = %#llx\n", x.
ui); printf("y.ui = %#llx\n", y.
ui); printf("(x.ui - y.ui) & mask = %lld\n", (x.
ui-y.
ui) & 0x7FFFFFFFFFFFF000L
); // 0 printf("x.ui - y.ui = %lld\n", (x.
ui-y.
ui) ); // 128 printf("x - y = %0.2e\n", x.
d - y.
d); // 1.00e printf( 0== ((x.
ui-y.
ui) & 0x7FFFFFFFFFFF0000L
) ? "is nearly equals" : "not equals at all" );
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxpbnR0eXBlcy5oPgoKI3ByYWdtYSBwYWNrKHB1c2gsIDEpCnR5cGVkZWYgdW5pb257CiAgICAgICAgZG91YmxlICAgICBkOwogICAgICAgIHVpbnQ2NF90IHVpOwkgICAgCn0gVW5za2lsb3phOwojcHJhZ21hIHBhY2socG9wKQoKCmludCBtYWluKCkgewogIFVuc2tpbG96YSB4LCB5OwogIHguZCA9IDQwMDAwMDAwMDAwMDAwOwogIHkuZCA9IDM5OTk5OTk5OTk5OTk5OwoKICBwcmludGYoIngudWkgPSAgJSNsbHhcbiIsIHgudWkpOwogIHByaW50ZigieS51aSA9ICAlI2xseFxuIiwgeS51aSk7CiAgcHJpbnRmKCIoeC51aSAtIHkudWkpICYgbWFzayA9ICAlbGxkXG4iLCAoeC51aS15LnVpKSAmIDB4N0ZGRkZGRkZGRkZGRjAwMEwpOyAgLy8gMAogIHByaW50ZigieC51aSAtIHkudWkgPSAgJWxsZFxuIiwgKHgudWkteS51aSkgKTsgIC8vIDEyOAogIHByaW50ZigieCAtIHkgPSAgJTAuMmVcbiIsIHguZCAtIHkuZCk7ICAgICAgICAgLy8gMS4wMGUKICBwcmludGYoIDA9PSAoKHgudWkteS51aSkgJiAweDdGRkZGRkZGRkZGRjAwMDBMKSA/ICJpcyBuZWFybHkgZXF1YWxzIiA6ICJub3QgZXF1YWxzIGF0IGFsbCIgKTsKCiAgcmV0dXJuIDA7Cn0=