fork download
  1. #include <limits.h>
  2. #include <string.h>
  3. #include <stdio.h>
  4.  
  5. #define C_ASSERT(expr) extern char CAssertExtern[(expr)?1:-1]
  6.  
  7. C_ASSERT(CHAR_BIT == 8);
  8. C_ASSERT(sizeof(float) == 4);
  9. C_ASSERT(sizeof(int) == 4);
  10.  
  11. float div(int x, unsigned n)
  12. {
  13. float res;
  14. unsigned e = 0;
  15. unsigned sign = x < 0;
  16. unsigned m = sign ? -x : x;
  17.  
  18. if (m)
  19. {
  20. while (m >= (1u << 24))
  21. m >>= 1, e++;
  22.  
  23. while (m < (1u << 23))
  24. m <<= 1, e--;
  25.  
  26. e += 0x7F + 23;
  27.  
  28. e -= n; // divide by 1<<n
  29.  
  30. m ^= 1u << 23; // reset the implicit 1
  31.  
  32. m |= (e & 0xFF) << 23; // mix in the exponent
  33.  
  34. m |= sign << 31; // mix in the sign
  35. }
  36.  
  37. memcpy(&res, &m, sizeof m);
  38.  
  39. return res;
  40. }
  41.  
  42. void Print4Bytes(unsigned char buf[4])
  43. {
  44. printf("%02X%02X%02X%02X ", buf[3], buf[2], buf[1], buf[0]);
  45. }
  46.  
  47. int main(void)
  48. {
  49. int x = 0x35AA53;
  50. int n;
  51. for (n = 0; n < 31; n++)
  52. {
  53. float v1 = (float)x/(1u << n);
  54. float v2 = div(x, n);
  55. Print4Bytes((void*)&v1);
  56. printf("%c= ", "!="[memcmp(&v1, &v2, sizeof v1) == 0]);
  57. Print4Bytes((void*)&v2);
  58. printf("%14.6f %14.6f\n", v1, v2);
  59. }
  60. return 0;
  61. }
  62.  
Success #stdin #stdout 0s 1832KB
stdin
Standard input is empty
stdout
4A56A94C == 4A56A94C 3517011.000000 3517011.000000
49D6A94C == 49D6A94C 1758505.500000 1758505.500000
4956A94C == 4956A94C  879252.750000  879252.750000
48D6A94C == 48D6A94C  439626.375000  439626.375000
4856A94C == 4856A94C  219813.187500  219813.187500
47D6A94C == 47D6A94C  109906.593750  109906.593750
4756A94C == 4756A94C   54953.296875   54953.296875
46D6A94C == 46D6A94C   27476.648438   27476.648438
4656A94C == 4656A94C   13738.324219   13738.324219
45D6A94C == 45D6A94C    6869.162109    6869.162109
4556A94C == 4556A94C    3434.581055    3434.581055
44D6A94C == 44D6A94C    1717.290527    1717.290527
4456A94C == 4456A94C     858.645264     858.645264
43D6A94C == 43D6A94C     429.322632     429.322632
4356A94C == 4356A94C     214.661316     214.661316
42D6A94C == 42D6A94C     107.330658     107.330658
4256A94C == 4256A94C      53.665329      53.665329
41D6A94C == 41D6A94C      26.832664      26.832664
4156A94C == 4156A94C      13.416332      13.416332
40D6A94C == 40D6A94C       6.708166       6.708166
4056A94C == 4056A94C       3.354083       3.354083
3FD6A94C == 3FD6A94C       1.677042       1.677042
3F56A94C == 3F56A94C       0.838521       0.838521
3ED6A94C == 3ED6A94C       0.419260       0.419260
3E56A94C == 3E56A94C       0.209630       0.209630
3DD6A94C == 3DD6A94C       0.104815       0.104815
3D56A94C == 3D56A94C       0.052408       0.052408
3CD6A94C == 3CD6A94C       0.026204       0.026204
3C56A94C == 3C56A94C       0.013102       0.013102
3BD6A94C == 3BD6A94C       0.006551       0.006551
3B56A94C == 3B56A94C       0.003275       0.003275