@ -6,7 +6,6 @@ long double nextafterl(long double x, long double y)
return nextafter ( x , y ) ;
return nextafter ( x , y ) ;
}
}
# elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
# elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
# define MSB ((uint64_t)1<<63)
long double nextafterl ( long double x , long double y )
long double nextafterl ( long double x , long double y )
{
{
union ldshape ux , uy ;
union ldshape ux , uy ;
@ -15,32 +14,32 @@ long double nextafterl(long double x, long double y)
return x + y ;
return x + y ;
if ( x = = y )
if ( x = = y )
return y ;
return y ;
ux . value = x ;
ux . f = x ;
if ( x = = 0 ) {
if ( x = = 0 ) {
uy . value = y ;
uy . f = y ;
ux . b its . m = 1 ;
ux . i . m = 1 ;
ux . bits . sign = uy . bits . sign ;
ux . i . se = uy . i . se & 0x8000 ;
} else if ( x < y ^ ux . bits . sign ) {
} else if ( ( x < y ) = = ! ( ux . i . se & 0x8000 ) ) {
ux . b its . m + + ;
ux . i . m + + ;
if ( ( ux . b its . m & ~ MSB ) = = 0 ) {
if ( ux . i . m < < 1 = = 0 ) {
ux . b its . m = MSB ;
ux . i . m = 1ULL < < 63 ;
ux . b its . exp + + ;
ux . i . s e+ + ;
}
}
} else {
} else {
if ( ( ux . b its . m & ~ MSB ) = = 0 ) {
if ( ux . i . m < < 1 = = 0 ) {
ux . b its . exp - - ;
ux . i . s e- - ;
if ( ux . b its . exp )
if ( ux . i . s e)
ux . b its . m = 0 ;
ux . i . m = 0 ;
}
}
ux . b its . m - - ;
ux . i . m - - ;
}
}
/* raise overflow if ux.value is infinite and x is finite */
/* raise overflow if ux is infinite and x is finite */
if ( ux . b its . exp = = 0x7fff )
if ( ( ux . i . s e & 0 x7fff ) = = 0x7fff )
return x + x ;
return x + x ;
/* raise underflow if ux.value is subnormal or zero */
/* raise underflow if ux is subnormal or zero */
if ( ux . b its . exp = = 0 )
if ( ( ux . i . s e & 0 x7fff ) = = 0 )
FORCE_EVAL ( x * x + ux . value * ux . value ) ;
FORCE_EVAL ( x * x + ux . f * ux . f ) ;
return ux . value ;
return ux . f ;
}
}
# elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
# elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
long double nextafterl ( long double x , long double y )
long double nextafterl ( long double x , long double y )
@ -51,32 +50,26 @@ long double nextafterl(long double x, long double y)
return x + y ;
return x + y ;
if ( x = = y )
if ( x = = y )
return y ;
return y ;
ux . value = x ;
ux . f = x ;
if ( x = = 0 ) {
if ( x = = 0 ) {
uy . value = y ;
uy . f = y ;
ux . bits . mlo = 1 ;
ux . i . lo = 1 ;
ux . bits . sign = uy . bits . sign ;
ux . i . se = uy . i . se & 0x8000 ;
} else if ( x < y ^ ux . bits . sign ) {
} else if ( ( x < y ) = = ! ( ux . i . se & 0x8000 ) ) {
ux . bits . mlo + + ;
ux . i2 . lo + + ;
if ( ux . bits . mlo = = 0 ) {
if ( ux . i2 . lo = = 0 )
ux . bits . mhi + + ;
ux . i2 . hi + + ;
if ( ux . bits . mhi = = 0 )
ux . bits . exp + + ;
}
} else {
} else {
if ( ux . bits . mlo = = 0 ) {
if ( ux . i2 . lo = = 0 )
if ( ux . bits . mhi = = 0 )
ux . i2 . hi - - ;
ux . bits . exp - - ;
ux . i2 . lo - - ;
ux . bits . mhi - - ;
}
ux . bits . mlo - - ;
}
}
/* raise overflow if ux.value is infinite and x is finite */
/* raise overflow if ux is infinite and x is finite */
if ( ux . b its . exp = = 0x7fff )
if ( ( ux . i . se & 0x7fff ) = = 0x7fff )
return x + x ;
return x + x ;
/* raise underflow if ux.value is subnormal or zero */
/* raise underflow if ux is subnormal or zero */
if ( ux . b its . exp = = 0 )
if ( ( ux . i . s e & 0 x7fff ) = = 0 )
FORCE_EVAL ( x * x + ux . value * ux . value ) ;
FORCE_EVAL ( x * x + ux . f * ux . f ) ;
return ux . value ;
return ux . f ;
}
}
# endif
# endif