fork download
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. void print(char *name, double x)
  5. {
  6. unsigned long long h = *(unsigned long long *)&x;
  7.  
  8. printf("%s = %03llX|%013llX (%.16f)\n", name, h >> 52, h << 12 >> 12, x);
  9. }
  10.  
  11. int main(void)
  12. {
  13. double q[] = {2, 3, 3.9999999999999996};
  14. double p, x, y, z;
  15.  
  16. for (int i = 0; i < sizeof(q) / sizeof(q[0]); i++) {
  17. for (int j = 0; j < 2; j++) {
  18. if (j == 0) {
  19. p = q[i];
  20. x = sqrt(p);
  21. printf("[p = %.17g]\n\n", p);
  22. printf("x = sqrt(p)\n");
  23. } else {
  24. x = z;
  25. printf("x = z\n");
  26. }
  27.  
  28. y = p / x;
  29. z = (x + y) / 2;
  30. print("x", x);
  31. print("y", y);
  32. print("z", z);
  33. printf("x %s z\n\n", x == z ? "==" : "!=");
  34. }
  35. }
  36. return 0;
  37. }
Success #stdin #stdout 0.01s 5292KB
stdin
Standard input is empty
stdout
[p = 2]

x = sqrt(p)
x = 3FF|6A09E667F3BCD (1.4142135623730951)
y = 3FF|6A09E667F3BCC (1.4142135623730949)
z = 3FF|6A09E667F3BCC (1.4142135623730949)
x != z

x = z
x = 3FF|6A09E667F3BCC (1.4142135623730949)
y = 3FF|6A09E667F3BCD (1.4142135623730951)
z = 3FF|6A09E667F3BCC (1.4142135623730949)
x == z

[p = 3]

x = sqrt(p)
x = 3FF|BB67AE8584CAA (1.7320508075688772)
y = 3FF|BB67AE8584CAB (1.7320508075688774)
z = 3FF|BB67AE8584CAA (1.7320508075688772)
x == z

x = z
x = 3FF|BB67AE8584CAA (1.7320508075688772)
y = 3FF|BB67AE8584CAB (1.7320508075688774)
z = 3FF|BB67AE8584CAA (1.7320508075688772)
x == z

[p = 3.9999999999999996]

x = sqrt(p)
x = 3FF|FFFFFFFFFFFFF (1.9999999999999998)
y = 400|0000000000000 (2.0000000000000000)
z = 400|0000000000000 (2.0000000000000000)
x != z

x = z
x = 400|0000000000000 (2.0000000000000000)
y = 3FF|FFFFFFFFFFFFF (1.9999999999999998)
z = 400|0000000000000 (2.0000000000000000)
x == z