#include <math.h>
#include <stdint.h>
#include <limits.h>
#warning *** untested -- we don't have tests for this
long long llrint( double x )
{
union{ double d; uint64_t u;} u = {x};
uint64_t absx = u.u & 0x7fffffffffffffffULL;
if( absx >= 0x4330000000000000ULL )
{
long long result = (long long) x;
if( x < (double) LONG_LONG_MIN )
return LONG_LONG_MIN;
if( x >= -((double) LONG_LONG_MIN) )
return LONG_LONG_MAX;
return result;
}
u.u = (u.u & 0x8000000000000000ULL) | 0x4330000000000000ULL;
x += u.d;
x -= u.d;
return (long long) x;
}