dfcmp.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:5k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * Linux/PA-RISC Project (http://www.parisc-linux.org/)
  3.  *
  4.  * Floating-point emulation code
  5.  *  Copyright (C) 2001 Hewlett-Packard (Paul Bame) <bame@debian.org>
  6.  *
  7.  *    This program is free software; you can redistribute it and/or modify
  8.  *    it under the terms of the GNU General Public License as published by
  9.  *    the Free Software Foundation; either version 2, or (at your option)
  10.  *    any later version.
  11.  *
  12.  *    This program is distributed in the hope that it will be useful,
  13.  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.  *    GNU General Public License for more details.
  16.  *
  17.  *    You should have received a copy of the GNU General Public License
  18.  *    along with this program; if not, write to the Free Software
  19.  *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20.  */
  21. /*
  22.  * BEGIN_DESC
  23.  *
  24.  *  File:
  25.  * @(#) pa/spmath/dfcmp.c $Revision: 1.1 $
  26.  *
  27.  *  Purpose:
  28.  * dbl_cmp: compare two values
  29.  *
  30.  *  External Interfaces:
  31.  * dbl_fcmp(leftptr, rightptr, cond, status)
  32.  *
  33.  *  Internal Interfaces:
  34.  *
  35.  *  Theory:
  36.  * <<please update with a overview of the operation of this file>>
  37.  *
  38.  * END_DESC
  39. */
  40. #include "float.h"
  41. #include "dbl_float.h"
  42.     
  43. /*
  44.  * dbl_cmp: compare two values
  45.  */
  46. int
  47. dbl_fcmp (dbl_floating_point * leftptr, dbl_floating_point * rightptr,
  48.   unsigned int cond, unsigned int *status)
  49.                                            
  50.                        /* The predicate to be tested */
  51.                          
  52.     {
  53.     register unsigned int leftp1, leftp2, rightp1, rightp2;
  54.     register int xorresult;
  55.         
  56.     /* Create local copies of the numbers */
  57.     Dbl_copyfromptr(leftptr,leftp1,leftp2);
  58.     Dbl_copyfromptr(rightptr,rightp1,rightp2);
  59.     /*
  60.      * Test for NaN
  61.      */
  62.     if(    (Dbl_exponent(leftp1) == DBL_INFINITY_EXPONENT)
  63.         || (Dbl_exponent(rightp1) == DBL_INFINITY_EXPONENT) )
  64. {
  65. /* Check if a NaN is involved.  Signal an invalid exception when 
  66.  * comparing a signaling NaN or when comparing quiet NaNs and the
  67.  * low bit of the condition is set */
  68.         if( ((Dbl_exponent(leftp1) == DBL_INFINITY_EXPONENT)
  69.     && Dbl_isnotzero_mantissa(leftp1,leftp2) 
  70.     && (Exception(cond) || Dbl_isone_signaling(leftp1)))
  71.    ||
  72.     ((Dbl_exponent(rightp1) == DBL_INFINITY_EXPONENT)
  73.     && Dbl_isnotzero_mantissa(rightp1,rightp2) 
  74.     && (Exception(cond) || Dbl_isone_signaling(rightp1))) )
  75.     {
  76.     if( Is_invalidtrap_enabled() ) {
  77.      Set_status_cbit(Unordered(cond));
  78. return(INVALIDEXCEPTION);
  79.     }
  80.     else Set_invalidflag();
  81.     Set_status_cbit(Unordered(cond));
  82.     return(NOEXCEPTION);
  83.     }
  84. /* All the exceptional conditions are handled, now special case
  85.    NaN compares */
  86.         else if( ((Dbl_exponent(leftp1) == DBL_INFINITY_EXPONENT)
  87.     && Dbl_isnotzero_mantissa(leftp1,leftp2))
  88.    ||
  89.     ((Dbl_exponent(rightp1) == DBL_INFINITY_EXPONENT)
  90.     && Dbl_isnotzero_mantissa(rightp1,rightp2)) )
  91.     {
  92.     /* NaNs always compare unordered. */
  93.     Set_status_cbit(Unordered(cond));
  94.     return(NOEXCEPTION);
  95.     }
  96. /* infinities will drop down to the normal compare mechanisms */
  97. }
  98.     /* First compare for unequal signs => less or greater or
  99.      * special equal case */
  100.     Dbl_xortointp1(leftp1,rightp1,xorresult);
  101.     if( xorresult < 0 )
  102.         {
  103.         /* left negative => less, left positive => greater.
  104.          * equal is possible if both operands are zeros. */
  105.         if( Dbl_iszero_exponentmantissa(leftp1,leftp2) 
  106.   && Dbl_iszero_exponentmantissa(rightp1,rightp2) )
  107.             {
  108.     Set_status_cbit(Equal(cond));
  109.     }
  110. else if( Dbl_isone_sign(leftp1) )
  111.     {
  112.     Set_status_cbit(Lessthan(cond));
  113.     }
  114. else
  115.     {
  116.     Set_status_cbit(Greaterthan(cond));
  117.     }
  118.         }
  119.     /* Signs are the same.  Treat negative numbers separately
  120.      * from the positives because of the reversed sense.  */
  121.     else if(Dbl_isequal(leftp1,leftp2,rightp1,rightp2))
  122.         {
  123.         Set_status_cbit(Equal(cond));
  124.         }
  125.     else if( Dbl_iszero_sign(leftp1) )
  126.         {
  127.         /* Positive compare */
  128. if( Dbl_allp1(leftp1) < Dbl_allp1(rightp1) )
  129.     {
  130.     Set_status_cbit(Lessthan(cond));
  131.     }
  132. else if( Dbl_allp1(leftp1) > Dbl_allp1(rightp1) )
  133.     {
  134.     Set_status_cbit(Greaterthan(cond));
  135.     }
  136. else
  137.     {
  138.     /* Equal first parts.  Now we must use unsigned compares to
  139.      * resolve the two possibilities. */
  140.     if( Dbl_allp2(leftp2) < Dbl_allp2(rightp2) )
  141. {
  142. Set_status_cbit(Lessthan(cond));
  143. }
  144.     else 
  145. {
  146. Set_status_cbit(Greaterthan(cond));
  147. }
  148.     }
  149. }
  150.     else
  151.         {
  152.         /* Negative compare.  Signed or unsigned compares
  153.          * both work the same.  That distinction is only
  154.          * important when the sign bits differ. */
  155. if( Dbl_allp1(leftp1) > Dbl_allp1(rightp1) )
  156.     {
  157.     Set_status_cbit(Lessthan(cond));
  158.     }
  159. else if( Dbl_allp1(leftp1) < Dbl_allp1(rightp1) )
  160.     {
  161.     Set_status_cbit(Greaterthan(cond));
  162.     }
  163. else
  164.     {
  165.     /* Equal first parts.  Now we must use unsigned compares to
  166.      * resolve the two possibilities. */
  167.     if( Dbl_allp2(leftp2) > Dbl_allp2(rightp2) )
  168. {
  169. Set_status_cbit(Lessthan(cond));
  170. }
  171.     else 
  172. {
  173. Set_status_cbit(Greaterthan(cond));
  174. }
  175.     }
  176.         }
  177. return(NOEXCEPTION);
  178.     }