// 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 */