/******************************************************************************* HARPtools by Chad D. Kersey, Summer 2011 *******************************************************************************/ #include #include #include "types.h" #ifdef DEBUG #include #define DEBUGMSG(x) do { \ std::cout << __FILE__ << ':' <<__LINE__ << ": " << x << '\n'; \ } while(0) #else #define DEBUGMSG(x) do { } while(0) #endif namespace Harp { // This class serves to handle the strange-precision floating point that can // crop up in HARP. class Float { public: Float(Word_u bin, Size n): sz(n) { DEBUGMSG("Float(0x" << std::hex << bin << ", " << std::dec << n << ')'); bool sign(bin >> (n*8 - 1)); Size expSz; if (n < 4) { expSz = 5; } else if (n < 8) { expSz = 8; } else { expSz = 11; } Size sigSz = n*8 - expSz - 1; DEBUGMSG(" exp: " << std::dec << expSz << " bits, sig: " << std::dec << sigSz << " bits."); int exp = (bin >> sigSz) & ((1< Word_u: " << d); Size expSz; if (sz < 4) { expSz = 5; } else if (sz < 8) { expSz = 8; } else { expSz = 11; } Size sigSz = 8*sz - expSz - 1; bool sign(d < 0); bool inf(std::isinf(d)), zero(d == 0.0); int exp; if (!inf && !zero) exp = floor(log2(fabs(d))); Word_u rval; if (inf) { // Infinity DEBUGMSG(" Inf."); rval = ((1llu<double " << d); return d; } private: double d; Size sz; }; }