@ -486,40 +486,6 @@ typedef unsigned short ushort;
# define test_all_bits(a,b) (((a) & (b)) == (b))
# define set_bits(type, bit_count) (sizeof(type)*8 <= (bit_count) ? ~(type) 0 : ((((type) 1) << (bit_count)) - (type) 1))
# define array_elements(A) ((uint) (sizeof(A) / sizeof(A[0])))
# ifndef HAVE_RINT
/**
All integers up to this number can be represented exactly as double precision
values ( DBL_MANT_DIG = = 53 for IEEE 754 hardware ) .
*/
# define MAX_EXACT_INTEGER ((1LL << DBL_MANT_DIG) - 1)
/**
rint ( 3 ) implementation for platforms that do not have it .
Always rounds to the nearest integer with ties being rounded to the nearest
even integer to mimic glibc ' s rint ( ) behavior in the " round-to-nearest "
FPU mode . Hardware - specific optimizations are possible ( frndint on x86 ) .
Unlike this implementation , hardware will also honor the FPU rounding mode .
*/
static inline double rint ( double x )
{
double f , i ;
f = modf ( x , & i ) ;
/*
All doubles with absolute values > MAX_EXACT_INTEGER are even anyway ,
no need to check it .
*/
if ( x > 0.0 )
i + = ( double ) ( ( f > 0.5 ) | | ( f = = 0.5 & &
i < = ( double ) MAX_EXACT_INTEGER & &
( longlong ) i % 2 ) ) ;
else
i - = ( double ) ( ( f < - 0.5 ) | | ( f = = - 0.5 & &
i > = ( double ) - MAX_EXACT_INTEGER & &
( longlong ) i % 2 ) ) ;
return i ;
}
# endif /* HAVE_RINT */
/* Define some general constants */
# ifndef TRUE
@ -1391,4 +1357,39 @@ do { doubleget_union _tmp; \
# define MY_INT64_NUM_DECIMAL_DIGITS 21
# ifndef HAVE_RINT
/**
All integers up to this number can be represented exactly as double precision
values ( DBL_MANT_DIG = = 53 for IEEE 754 hardware ) .
*/
# define MAX_EXACT_INTEGER ((1LL << DBL_MANT_DIG) - 1)
/**
rint ( 3 ) implementation for platforms that do not have it .
Always rounds to the nearest integer with ties being rounded to the nearest
even integer to mimic glibc ' s rint ( ) behavior in the " round-to-nearest "
FPU mode . Hardware - specific optimizations are possible ( frndint on x86 ) .
Unlike this implementation , hardware will also honor the FPU rounding mode .
*/
static inline double rint ( double x )
{
double f , i ;
f = modf ( x , & i ) ;
/*
All doubles with absolute values > MAX_EXACT_INTEGER are even anyway ,
no need to check it .
*/
if ( x > 0.0 )
i + = ( double ) ( ( f > 0.5 ) | | ( f = = 0.5 & &
i < = ( double ) MAX_EXACT_INTEGER & &
( longlong ) i % 2 ) ) ;
else
i - = ( double ) ( ( f < - 0.5 ) | | ( f = = - 0.5 & &
i > = ( double ) - MAX_EXACT_INTEGER & &
( longlong ) i % 2 ) ) ;
return i ;
}
# endif /* HAVE_RINT */
# endif /* my_global_h */