dbertoni    00/12/01 13:36:01

  Modified:    c/src/PlatformSupport DoubleSupport.cpp DoubleSupport.hpp
  Log:
  Special support code for positive and negative infinity.
  
  Revision  Changes    Path
  1.17      +26 -10    xml-xalan/c/src/PlatformSupport/DoubleSupport.cpp
  
  Index: DoubleSupport.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/PlatformSupport/DoubleSupport.cpp,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- DoubleSupport.cpp 2000/11/29 21:48:34     1.16
  +++ DoubleSupport.cpp 2000/12/01 21:36:00     1.17
  @@ -70,6 +70,8 @@
   const double DoubleSupport::s_NaN = sqrt(-2.01);
   const double DoubleSupport::s_positiveInfinity = HUGE_VAL;
   const double DoubleSupport::s_negativeInfinity = 
-DoubleSupport::s_positiveInfinity;
  +const double DoubleSupport::s_positiveZero = 0.0;
  +const double DoubleSupport::s_negativeZero = -DoubleSupport::s_positiveZero;
   
   
   
  @@ -84,7 +86,27 @@
                                        s_NaNFirstDWORD + 1;
   
   
  +const unsigned long* DoubleSupport::s_positiveZeroFirstDWORD =
  +#if defined(XALAN_OLD_STYLE_CASTS)
  +                                     (const unsigned long*)&s_positiveZero;
  +#else
  +                                     reinterpret_cast<const unsigned 
long*>(&s_positiveZero);
  +#endif
  +
  +const unsigned long* DoubleSupport::s_positiveZeroSecondDWORD = 
s_positiveZeroFirstDWORD + 1;
  +
  +
  +const unsigned long* DoubleSupport::s_negativeZeroFirstDWORD =
  +#if defined(XALAN_OLD_STYLE_CASTS)
  +                                     (const unsigned long*)&s_negativeZero;
  +#else
  +                                     reinterpret_cast<const unsigned 
long*>(&s_negativeZero);
  +#endif
  +
  +const unsigned long* DoubleSupport::s_negativeZeroSecondDWORD = 
s_negativeZeroFirstDWORD + 1;
   
  +
  +
   bool
   DoubleSupport::equal(
                        double  theLHS,
  @@ -107,14 +129,7 @@
                        double  theLHS,
                        double  theRHS)
   {
  -     if (isNaN(theLHS) == true || isNaN(theRHS) == true)
  -     {
  -             return true;
  -     }
  -     else
  -     {
  -             return theLHS != theRHS;
  -     }
  +     return !equal(theLHS, theRHS);
   }
   
   
  @@ -276,14 +291,15 @@
                        // This is NaN...
                        return DoubleSupport::getNaN();
                }
  -             else if (theLHS > 0.0L)
  +             else if (theLHS > 0.0L &&
  +                              isPositiveZero(theRHS) == true)
                {
                        // This is positive infinity...
                        return DoubleSupport::getPositiveInfinity();
                }
                else
                {
  -                     // This is positive infinity...
  +                     // This is negative infinity...
                        return DoubleSupport::getNegativeInfinity();
                }
        }
  
  
  
  1.9       +56 -0     xml-xalan/c/src/PlatformSupport/DoubleSupport.hpp
  
  Index: DoubleSupport.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/PlatformSupport/DoubleSupport.hpp,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- DoubleSupport.hpp 2000/10/02 16:28:10     1.8
  +++ DoubleSupport.hpp 2000/12/01 21:36:00     1.9
  @@ -130,6 +130,54 @@
                return !isNaN(theNumber) && theNumber == s_negativeInfinity;
        }
   
  +     /**
  +      * Determine if target is positive 0.
  +      * 
  +      * @param theNumber target number
  +      * @return true if target represents the value for positive 0.
  +      */
  +     static bool
  +     isPositiveZero(double   theNumber)
  +     {
  +             // Compare the two DWORDs of the double as unsigned longs.
  +             const unsigned long* const      theFirstDWORD =
  +#if defined(XALAN_OLD_STYLE_CASTS)
  +                     (const unsigned long*)&theNumber;
  +#else
  +                     reinterpret_cast<const unsigned long*>(&theNumber);
  +#endif
  +
  +             const unsigned long* const      theSecondDWORD =
  +                                                     theFirstDWORD + 1;
  +
  +             return *theFirstDWORD == *s_positiveZeroFirstDWORD &&
  +                        *theSecondDWORD == *s_positiveZeroSecondDWORD;
  +     }
  +
  +     /**
  +      * Determine if target is negative 0
  +      * 
  +      * @param theNumber target number
  +      * @return true if target represents the value for negative 0
  +      */
  +     static bool
  +     isNegativeZero(double   theNumber)
  +     {
  +             // Compare the two DWORDs of the double as unsigned longs.
  +             const unsigned long* const      theFirstDWORD =
  +#if defined(XALAN_OLD_STYLE_CASTS)
  +                     (const unsigned long*)&theNumber;
  +#else
  +                     reinterpret_cast<const unsigned long*>(&theNumber);
  +#endif
  +
  +             const unsigned long* const      theSecondDWORD =
  +                                                     theFirstDWORD + 1;
  +
  +             return *theFirstDWORD == *s_negativeZeroFirstDWORD &&
  +                        *theSecondDWORD == *s_negativeZeroSecondDWORD;
  +     }
  +
        // These can be used to initialize values, but should not
        // be used to do equality comparisons, as == may fail on
        // some platforms.
  @@ -514,9 +562,17 @@
        static const double                             s_NaN;
        static const double                             s_positiveInfinity;
        static const double                             s_negativeInfinity;
  +     static const double                             s_positiveZero;
  +     static const double                             s_negativeZero;
   
        static const unsigned long*             s_NaNFirstDWORD;
        static const unsigned long*             s_NaNSecondDWORD;
  +
  +     static const unsigned long*             s_positiveZeroFirstDWORD;
  +     static const unsigned long*             s_positiveZeroSecondDWORD;
  +
  +     static const unsigned long*             s_negativeZeroFirstDWORD;
  +     static const unsigned long*             s_negativeZeroSecondDWORD;
   };
   
   
  
  
  

Reply via email to