Listing 2 Constructor functions and overloaded operators

inline sfloat::sfloat() {}

inline sfloat::sfloat( float f )
   {

   // Init conversion union
   u.f = f;

   // Get the sign
   if ( Signed )
      {
      if ( !fsfBias )
         {
         s = u.s[1];
         return;
         }
      s = (unsigned short)
           (( u.l & fManSignMask ) >> sfBits );
      }
   else
      {
      s = 0;
      }

   // Get the exponent
   Exp = (unsigned short)
        (( u.l & fExpMask ) >> fManBits ) -
        fsfBias;

   // Compress the exponent
   Exp = ( Exp << ( sfExpShift )) >> sfManSignBits;

   // Get the mantissa
   Man = (unsigned short)(( u.l & fManMask ) >>
        ( sfManShift ));

   s |= Man | Exp;

   }   // sfloat( float )

inline sfloat::sfloat( sfloat& sf ) : s( sf.s ) {}

// Cast - conversion operators
inline sfloat::operator float()
   {

   // Get the sign - Init conversion union
   if ( Signed )

      {
      if ( !fsfBias )
         {j
         u.s.[1] = s;
         return ( u.f );
         }
      u.l = ( (unsigned long)
           (s & sfManSignMask )) << sfBits;
      }
   else
      {
      u.l = 0L;
      }

   // Get exponent
   u.l |= (unsigned long)((( s << sfManSignBits ) >>
        fExpShift ) + fsfBias ) << fManBits;

   // Get the mantisa
   u.l |= ( (unsigned long)( s << fManShift1 )) <<
        fManShift2;

   return ( u.f );

   }   // operator(float)

// Overloaded operators

// Assigment operators
inline sfloat &sfloat::operator+=( sfloat sf )
   {
   float f = (float)*this;
   f += (float)sf;
   *this = (sfloat)f;
   return ( *this );
   }   // operator+=

inline sfloat &sfloat::operator-=( sfloat sf )
   {
   float f = (float)*this;
   f - = (float)sf;
   *this = (sfloat)f;
   return ( *this );
   }   // operator-=

inline sfloat &sfloat::operator*=( sfloat sf )
   {
   float f = (float)*this;
   f *= (float)sf;
   *this = (sfloat)f;
   return ( *this );
   }   // operator*=

inline sfloat &sfloat::operator/=( sfloat sf )
   {
   float f = (float)*this;j
   *this = (sfloat)f;
   return ( *this );
   }   // operator*=

// increment operators
inline sfloat sfloat::operator++()
   { return ( *this += 1.0f ); }

inline sfloat sfloat::operator--()
   { return ( *this - = 1.0f ); }

inline sfloat sfloat::operator++( int )
   {
   sfloat sf( *this );
   *this += 1.0f;
   return ( sf );
   }   // operator ++

inline sfloat sfloat::operator--(int )
   {
   sfloat sf( *this );
   *this - = 1.0f;
   return ( sf );
   } // operator --

// sign change operators
inline sfloat sfloat::operator+()
   { return ( *this ); }

inline sfloat sfloat::operator-()
   {
   sfloat sf( 0.0f ):
   return ( sf - *this );
   }   // operator -

// Logical operators
inline int operator==( sfloat sf1, sfloat sf2)
   { return ( sf1.s == sf2.s ); }

inline int operator<=( sfloat sf1, sfloat sf2 )
   { return ( sf1.s <= sf2.s ); }

inline int operator>=( sfloat sf1, sfloat sf2 )
   { return ( sf1.s >= sf2.s ); }

inline int operator<( sfloat sf1, sfloat sf2 )
   { return ( sf1.s < sf2.s ); }

inline int operator>( sfloat sf1, sfloat sf2 )
   { return ( sf1.s > sf2.s ); }

inline int operator!=( sfloat sf1, sfloat sf2 )
   { return ( !( sf1.s == sf2.s )); }j
// math operations
inline sfloat operator+( sfloat sf1, sfloat sf2 )
   { return ( sf1 += sf2 ); }

inline sfloat operator-( sfloat sf1, sfloat sf2 )
   { return ( sf1 - = sf2 ); }

inline sfloat operator*( sfloat sf1, sfloat sf2 )
   { return ( sf1 *= sf2 ); }

inline sfloat operator/( sfloat sf1, sfloat sf2 )
   { return ( sf1 /= sf2 ); }

// End of SFLOAT.INL