Listing 1: Class definition for floating-point class fp

// fp.h
//    class fp

#ifndef FP_H
#define FP_H

#include <iosfwd>
#include <string>

class fp
{    // naive floating-point implementation

public:

    fp();
    explicit fp(const char *);
    explicit fp(double);
    
    fp& operator += (const fp&);
    fp& operator -= (const fp&);
    fp& operator *= (const fp&);
    fp& operator /= (const fp&);
    friend fp operator - (const fp&);
    
    friend bool operator == (const fp&, const fp&);
    friend bool operator != (const fp&, const fp&);
    friend bool operator <  (const fp&, const fp&);
    friend bool operator <= (const fp&, const fp&);
    friend bool operator >  (const fp&, const fp&);
    friend bool operator >= (const fp&, const fp&);

    static const fp zero;
    static const fp one;
    static const fp two;

    friend std::string to_string(const fp&);
    friend std::ostream& operator << (std::ostream&, const fp&);

private:

    bool eq(const fp&) const;
    bool lt(const fp&) const;
    
    fp& add(const fp&, const fp&);
    fp& normalize(int, long);
    void convert(double);
    long lf() const;
    
    enum fp_exception
        {
        div_by_zero,
        exp_underflow,
        exp_overflow
        };

    void exception(fp_exception);

    bool is_neg;
    unsigned char exp;
    int frac;

};

fp operator + (const fp&, const fp&);
fp operator - (const fp&, const fp&);
fp operator * (const fp&, const fp&);
fp operator / (const fp&, const fp&);

inline bool operator == (const fp& f1, const fp& f2)
    {    // return f1 equal to f2
    return f1.eq(f2);
    }

inline bool operator != (const fp& f1, const fp& f2)
    {    // return f1 not equal to f2
    return !f1.eq(f2);
    }

inline bool operator <  (const fp& f1, const fp& f2)
    {    // return f1 less than f2
    return f1.lt(f2);
    }

inline bool operator <= (const fp& f1, const fp& f2)
    {    // return f1 less than or equal to f2
    return !f2.lt(f1);
    }

inline bool operator >  (const fp& f1, const fp& f2)
    {    // return f1 greater than f2
    return f2.lt(f1);
    }

inline bool operator >= (const fp& f1, const fp& f2)
    {    // return f1 greater than or equal to f2
    return !f1.lt(f2);
    }

#endif    /* FP_H */