- float f;
- char d[sizeof(float)];
- };
-
-#if BYTE_ORDER == LITTLE_ENDIAN
- for(unsigned i = sizeof(float); i--;)
- d[i] = in.get();
-#else
- for(unsigned i = 0; i<sizeof(float); ++i)
- d[i] = in.get();
-#endif
-
- return f;
+ int c = in.get();
+ encoded = (encoded<<8) | (c&0xFF);
+ }
+
+ BinFloat bf = BinFloat::explode(encoded, float_precision);
+
+ if(numeric_limits<FloatType::Store>::is_iec559)
+ return bf.compose_iec559<FloatType::Store>();
+ else
+ {
+ /* Put the float together with arithmetic since we don't know its
+ internal layout */
+ FloatType::Store f = 0;
+ if(bf.infinity)
+ {
+ if(numeric_limits<FloatType::Store>::has_infinity)
+ f = numeric_limits<FloatType::Store>::infinity();
+ else
+ f = numeric_limits<FloatType::Store>::max();
+ }
+ else
+ {
+ for(unsigned i=0; i<64; ++i)
+ {
+ f /= 2;
+ if(bf.mantissa&1)
+ f += 1;
+ bf.mantissa >>= 1;
+ }
+ for(int i=0; i<bf.exponent; ++i)
+ f *= 2;
+ for(int i=0; i>bf.exponent; --i)
+ f /= 2;
+ }
+ if(bf.sign)
+ f = -f;
+ return f;
+ }