fork download
  1. #include <stdio.h>
  2. #include <inttypes.h>
  3.  
  4. #pragma pack(push, 1)
  5. typedef union{
  6. double d;
  7. uint64_t ui;
  8. } Unskiloza;
  9. #pragma pack(pop)
  10.  
  11.  
  12. int main() {
  13. Unskiloza x, y;
  14. x.d = 40000000000000;
  15. y.d = 39999999999999;
  16.  
  17. printf("x.ui = %#llx\n", x.ui);
  18. printf("y.ui = %#llx\n", y.ui);
  19. printf("(x.ui - y.ui) & mask = %lld\n", (x.ui-y.ui) & 0x7FFFFFFFFFFFF000L); // 0
  20. printf("x.ui - y.ui = %lld\n", (x.ui-y.ui) ); // 128
  21. printf("x - y = %0.2e\n", x.d - y.d); // 1.00e
  22. printf( 0== ((x.ui-y.ui) & 0x7FFFFFFFFFFF0000L) ? "is nearly equals" : "not equals at all" );
  23.  
  24. return 0;
  25. }
Success #stdin #stdout 0s 4508KB
stdin
Standard input is empty
stdout
x.ui =  0x42c2309ce5400000
y.ui =  0x42c2309ce53fff80
(x.ui - y.ui) & mask =  0
x.ui - y.ui =  128
x - y =  1.00e+00
is nearly equals