2005-04-16 15:20:36 -07:00
/* IEEE754 floating point arithmetic
* double precision : common utilities
*/
/*
* MIPS floating point support
* Copyright ( C ) 1994 - 2000 Algorithmics Ltd .
*
* # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
*
* This program is free software ; you can distribute it and / or modify it
* under the terms of the GNU General Public License ( Version 2 ) as
* published by the Free Software Foundation .
*
* This program is distributed in the hope it will be useful , but WITHOUT
* ANY WARRANTY ; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE . See the GNU General Public License
* for more details .
*
* You should have received a copy of the GNU General Public License along
* with this program ; if not , write to the Free Software Foundation , Inc . ,
* 59 Temple Place - Suite 330 , Boston MA 02111 - 1307 , USA .
*
* # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
*/
# include "ieee754dp.h"
int ieee754dp_finite ( ieee754dp x )
{
return DPBEXP ( x ) ! = DP_EMAX + 1 + DP_EBIAS ;
}
ieee754dp ieee754dp_copysign ( ieee754dp x , ieee754dp y )
{
CLEARCX ;
DPSIGN ( x ) = DPSIGN ( y ) ;
return x ;
}
ieee754dp ieee754dp_neg ( ieee754dp x )
{
COMPXDP ;
EXPLODEXDP ;
CLEARCX ;
FLUSHXDP ;
2006-01-02 21:59:49 +09:00
/*
* Invert the sign ALWAYS to prevent an endless recursion on
* pow ( ) in libc .
*/
/* quick fix up */
DPSIGN ( x ) ^ = 1 ;
2005-04-16 15:20:36 -07:00
if ( xc = = IEEE754_CLASS_SNAN ) {
2006-01-02 21:59:49 +09:00
ieee754dp y = ieee754dp_indef ( ) ;
2005-04-16 15:20:36 -07:00
SETCX ( IEEE754_INVALID_OPERATION ) ;
2006-01-02 21:59:49 +09:00
DPSIGN ( y ) = DPSIGN ( x ) ;
return ieee754dp_nanxcpt ( y , " neg " ) ;
2005-04-16 15:20:36 -07:00
}
return x ;
}
ieee754dp ieee754dp_abs ( ieee754dp x )
{
COMPXDP ;
EXPLODEXDP ;
CLEARCX ;
FLUSHXDP ;
2009-10-12 14:57:18 -07:00
/* Clear sign ALWAYS, irrespective of NaN */
DPSIGN ( x ) = 0 ;
2005-04-16 15:20:36 -07:00
if ( xc = = IEEE754_CLASS_SNAN ) {
2010-05-11 18:30:34 -07:00
SETCX ( IEEE754_INVALID_OPERATION ) ;
2009-10-12 14:57:18 -07:00
return ieee754dp_nanxcpt ( ieee754dp_indef ( ) , " abs " ) ;
2005-04-16 15:20:36 -07:00
}
return x ;
}