fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int validIEEE(void) {
  6. if (sizeof (double) != 8) return 0;
  7. double x = -3.14159;
  8. unsigned char data[] = {0x6e, 0x86, 0x1b, 0xf0, 0xf9, 0x21, 0x09, 0xc0};
  9. if (memcmp(&x, data, 8)) return 0;
  10. return 1;
  11. }
  12.  
  13. void printIEEE(void *xx) {
  14. unsigned char *x = xx;
  15. putchar((x[7] & 0x80) ? '-' : '+');
  16. printf("1.");
  17. for (int j = 3; j >= 0; j--) {
  18. putchar((x[6] & (1 << j)) ? '1' : '0');
  19. }
  20. for (int k = 5; k >= 0; k--) {
  21. for (int j = 7; j >= 0; j--) {
  22. putchar((x[k] & (1 << j)) ? '1' : '0');
  23. }
  24. }
  25. unsigned exp = ((x[7] & 0x7fu) << 4) + (x[6] >> 4);
  26. printf(" %+d ", (int)exp - 1023);
  27. putchar('\n');
  28. }
  29.  
  30. int main(void) {
  31. if (!validIEEE()) {
  32. fprintf(stderr, "This computer does not pass the tests for valid IEEE numbers.\n");
  33. exit(EXIT_FAILURE);
  34. }
  35. while (1) {
  36. double x;
  37. printf("Enter a number: ");
  38. fflush(stdout);
  39. if (scanf("%lf", &x) != 1) break;
  40. printf("%f is ", x);
  41. printIEEE(&x);
  42. }
  43. return 0;
  44. }
  45.  
Success #stdin #stdout 0s 2164KB
stdin
1.25
-12.5
3.14159
-0.0000000000001
-1000000000000
1000000000000
foo
stdout
Enter a number: 1.250000 is +1.0100000000000000000000000000000000000000000000000000 +0 
Enter a number: -12.500000 is -1.1001000000000000000000000000000000000000000000000000 +3 
Enter a number: 3.141590 is +1.1001001000011111100111110000000110111000011001101110 +1 
Enter a number: -0.000000 is -1.1100001001011100001001101000010010010111011010000010 -44 
Enter a number: -1000000000000.000000 is -1.1101000110101001010010100010000000000000000000000000 +39 
Enter a number: 1000000000000.000000 is +1.1101000110101001010010100010000000000000000000000000 +39 
Enter a number: