#include <limits.h>
#include <math.h>
#include <stdint.h>
#warning *** untested -- we don't have tests for this
long long llroundf( float x )
{
union{ float f; uint32_t u;}u = {x};
uint32_t absx = u.u & 0x7fffffff;
long long result = (long long) x;
if( absx >= 0x4b000000U ) {
if( x < (float) LONG_LONG_MIN )
return LONG_LONG_MIN;
if( x >= -((float) LONG_LONG_MIN) )
return LONG_LONG_MAX;
return x;
}
if( (float) result != x )
{
union{ uint32_t u; float f;} v = { (u.u & 0x80000000U) | 0x3f000000U };
if( absx == 0x3effffffU )
return result;
x += v.f;
result = (long long) x;
}
return result;
}