#include <math.h>
#include <float.h>
#include <stdio.h>
#include <limits.h>
unsigned long long dbl2ulonglong(double f)
{
unsigned long long l = 0, i;
double d;
for (i = 0x8000000000000000ULL, d = 0x1.0p63; i; i/=2, d/=2)
if (f >= d) l += i, f -= d;
return l;
}
int main()
{
double f = 123456.;
unsigned long long l = dbl2ulonglong(f);
printf("result:%.18g %llu\n", f
, l
);
f = ULLONG_MAX * 0.99;
l = dbl2ulonglong(f);
printf("result:%.18g %llu\n", f
, l
);
printf("rounding:%llu %llu %llu %llu\n", dbl2ulonglong(DBL_MIN),
dbl2ulonglong(1.4),
dbl2ulonglong(1.5),
dbl2ulonglong(1.6));
return 0;
}
I2luY2x1ZGUgPG1hdGguaD4KI2luY2x1ZGUgPGZsb2F0Lmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8bGltaXRzLmg+Cgp1bnNpZ25lZCBsb25nIGxvbmcgZGJsMnVsb25nbG9uZyhkb3VibGUgZikKewogIHVuc2lnbmVkIGxvbmcgbG9uZyBsID0gMCwgaTsKICBkb3VibGUgZDsKICBmb3IgKGkgPSAweDgwMDAwMDAwMDAwMDAwMDBVTEwsIGQgPSAweDEuMHA2MzsgaTsgaS89MiwgZC89MikKICAgIGlmIChmID49IGQpIGwgKz0gaSwgZiAtPSBkOwogIHJldHVybiBsOwp9CgppbnQgbWFpbigpCnsKICBkb3VibGUgZiA9IDEyMzQ1Ni47CiAgdW5zaWduZWQgbG9uZyBsb25nIGwgPSBkYmwydWxvbmdsb25nKGYpOwogIHByaW50ZigicmVzdWx0OiUuMThnICVsbHVcbiIsIGYsIGwpOwoKICBmID0gVUxMT05HX01BWCAqIDAuOTk7CiAgbCA9IGRibDJ1bG9uZ2xvbmcoZik7CiAgcHJpbnRmKCJyZXN1bHQ6JS4xOGcgJWxsdVxuIiwgZiwgbCk7CgogIHByaW50Zigicm91bmRpbmc6JWxsdSAlbGx1ICVsbHUgJWxsdVxuIiwgCgkgZGJsMnVsb25nbG9uZyhEQkxfTUlOKSwKCSBkYmwydWxvbmdsb25nKDEuNCksCgkgZGJsMnVsb25nbG9uZygxLjUpLAoJIGRibDJ1bG9uZ2xvbmcoMS42KSk7CgogIHJldHVybiAwOwp9Cg==