9 BinFloat BinFloat::explode(uint64_t value, const Bits &bits)
11 uint64_t mantissa_mask = (1ULL<<bits.mantissa)-1;
12 int exponent_mask = (1<<bits.exponent)-1;
15 // Extract biased exponent and sign
16 bf.exponent = (value>>bits.mantissa)&exponent_mask;
17 bf.sign = value>>(bits.mantissa+bits.exponent);
18 bf.infinity = (bf.exponent==exponent_mask);
20 if(bf.exponent==0 || bf.infinity)
21 // Zeroes and infinities have zero mantissa
25 // Extract mantissa, add the implied one and align it to high bits
26 bf.mantissa = (value&mantissa_mask) | (uint64_t(1)<<bits.mantissa);
27 bf.mantissa <<= 63-bits.mantissa;
30 // Unbias the exponent
31 bf.exponent -= exponent_mask>>1;
36 uint64_t BinFloat::compose(const Bits &bits)
38 uint64_t mantissa_mask = (1ULL<<bits.mantissa)-1;
39 int exponent_mask = (1<<bits.exponent)-1;
41 int biased_exponent = exponent+(exponent_mask>>1);
42 // Shift down and round the mantissa
43 uint64_t rounded_mantissa = ((mantissa>>(62-bits.mantissa))+1)>>1;
44 // If the integer part is greater than one, we need to use a higher exponent
45 if((rounded_mantissa>>bits.mantissa)>1)
48 if(biased_exponent>=exponent_mask || infinity)
49 // Overflow, return infinity
50 return uint64_t(sign<<bits.exponent | exponent_mask)<<bits.mantissa;
51 else if(biased_exponent<=0 || !mantissa)
52 // Underflow, return zero
56 uint64_t value = rounded_mantissa&mantissa_mask;
57 value |= uint64_t(biased_exponent)<<bits.mantissa;
58 value |= uint64_t(sign)<<(bits.mantissa+bits.exponent);
64 // exponent = log_2(bits)*3-7
65 BinFloat::Bits::Bits(unsigned bits):
66 exponent(log(bits)*4.3281-7),
67 mantissa(bits-exponent-1)
70 } // namespace DataFile