fork(1) download
  1. #include <math.h>
  2. #include <float.h>
  3. #include <stdio.h>
  4. #include <limits.h>
  5.  
  6. unsigned long long dbl2ulonglong(double f)
  7. {
  8. unsigned long long l = 0, i;
  9. double d;
  10. for (i = 0x8000000000000000ULL, d = 0x1.0p63; i; i/=2, d/=2)
  11. if (f >= d) l += i, f -= d;
  12. return l;
  13. }
  14.  
  15. int main()
  16. {
  17. double f = 123456.;
  18. unsigned long long l = dbl2ulonglong(f);
  19. printf("result:%.18g %llu\n", f, l);
  20.  
  21. f = ULLONG_MAX * 0.99;
  22. l = dbl2ulonglong(f);
  23. printf("result:%.18g %llu\n", f, l);
  24.  
  25. printf("rounding:%llu %llu %llu %llu\n",
  26. dbl2ulonglong(DBL_MIN),
  27. dbl2ulonglong(1.4),
  28. dbl2ulonglong(1.5),
  29. dbl2ulonglong(1.6));
  30.  
  31. return 0;
  32. }
  33.  
Success #stdin #stdout 0s 1832KB
stdin
Standard input is empty
stdout
result:123456 123456
result:1.82622766329724559e+19 18262276632972455936
rounding:0 1 1 1