#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;
}