// https://stackoverflow.com/q/17035464/4208440
#include <cstdio>
/**
* Round to the nearest integer.
* for tie-breaks: round half to even (bankers' rounding)
*/
inline double rint(double d)
{
double x = 6755399441055744.0; // 1.5 * pow (2, 52);
return d + x - x;
}
int main()
{
// round to nearest integer
printf("%.1f, %.1f\n", rint(-12345678.3), rint(-12345678.9));
// test tie-breaking rule
printf("%.1f, %.1f, %.1f, %.1f\n", rint(-24.5), rint(-23.5), rint(23.5), rint(24.5));
return 0;
}
// output:
// -12345678.0, -12345679.0
// -24.0, -24.0, 24.0, 24.0
Ly8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xLzE3MDM1NDY0LzQyMDg0NDAKI2luY2x1ZGUgPGNzdGRpbz4KCi8qKgogKiBSb3VuZCB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLgogKiBmb3IgdGllLWJyZWFrczogcm91bmQgaGFsZiB0byBldmVuIChiYW5rZXJzJyByb3VuZGluZykKICovCmlubGluZSBkb3VibGUgcmludChkb3VibGUgZCkKewoJZG91YmxlIHggPSA2NzU1Mzk5NDQxMDU1NzQ0LjA7ICAvLyAxLjUgKiBwb3cgKDIsIDUyKTsKICAgIHJldHVybiBkICsgeCAtIHg7Cn0KCmludCBtYWluKCkKewoJLy8gcm91bmQgdG8gbmVhcmVzdCBpbnRlZ2VyCiAgICBwcmludGYoIiUuMWYsICUuMWZcbiIsIHJpbnQoLTEyMzQ1Njc4LjMpLCByaW50KC0xMjM0NTY3OC45KSk7CgogICAgLy8gdGVzdCB0aWUtYnJlYWtpbmcgcnVsZQogICAgcHJpbnRmKCIlLjFmLCAlLjFmLCAlLjFmLCAlLjFmXG4iLCByaW50KC0yNC41KSwgcmludCgtMjMuNSksIHJpbnQoMjMuNSksIHJpbnQoMjQuNSkpOwogICAgcmV0dXJuIDA7Cn0KCi8vIG91dHB1dDoKLy8gLTEyMzQ1Njc4LjAsIC0xMjM0NTY3OS4wCi8vIC0yNC4wLCAtMjQuMCwgMjQuMCwgMjQuMAo=