#ifndef FPE_H
#define FPE_H
#include "types.h"
template <typename T>
struct FPEtraits;
template <>
struct FPEtraits<float> {
typedef uint32 U;
static const uint mbits = 23;
static const uint ebits = 8;
};
template <>
struct FPEtraits<double> {
typedef uint64 U;
static const uint mbits = 52;
static const uint ebits = 11;
};
template <
typename T, typename U = typename FPEtraits<T>::U, uint mbits = FPEtraits<T>::mbits, uint ebits = FPEtraits<T>::ebits >
class FPE {
public:
FPE(U u = 0) : u(u) {}
FPE(T t) : u((U&)t) {}
FPE(int i) : u(i) {}
operator T() const { return (T&)u; }
bool equalsign(FPE x) const { return !((u ^ x.u) & s); }
FPE operator -() const { return FPE(u ^ s); }
FPE operator +(FPE x) const;
FPE operator -(FPE x) const;
private:
FPE add(U g) const; FPE sub(U g) const; static const uint m = mbits; static const U e = U(1) << mbits; static const U s = e << ebits; U u; };
#include "fpe.inl"
#endif