10 BinFloat BinFloat::explode(UInt64 value, const Bits &bits)
12 UInt64 mantissa_mask = (UInt64(1)<<bits.mantissa)-1;
13 int exponent_mask = (1<<bits.exponent)-1;
16 // Extract biased exponent and sign
17 bf.exponent = (value>>bits.mantissa)&exponent_mask;
18 bf.sign = value>>(bits.mantissa+bits.exponent);
19 bf.infinity = (bf.exponent==exponent_mask);
21 if(bf.exponent==0 || bf.infinity)
22 // Zeroes and infinities have zero mantissa
26 // Extract mantissa, add the implied one and align it to high bits
27 bf.mantissa = (value&mantissa_mask) | (UInt64(1)<<bits.mantissa);
28 bf.mantissa <<= 63-bits.mantissa;
31 // Unbias the exponent
32 bf.exponent -= exponent_mask>>1;
37 UInt64 BinFloat::compose(const Bits &bits)
39 UInt64 mantissa_mask = (UInt64(1)<<bits.mantissa)-1;
40 int exponent_mask = (1<<bits.exponent)-1;
42 int biased_exponent = exponent+(exponent_mask>>1);
43 // Shift down and round the mantissa
44 UInt64 rounded_mantissa = ((mantissa>>(62-bits.mantissa))+1)>>1;
45 // If the integer part is greater than one, we need to use a higher exponent
46 if((rounded_mantissa>>bits.mantissa)>1)
49 if(biased_exponent>=exponent_mask || infinity)
50 // Overflow, return infinity
51 return UInt64(sign<<bits.exponent | exponent_mask)<<bits.mantissa;
52 else if(biased_exponent<=0 || !mantissa)
53 // Underflow, return zero
57 UInt64 value = rounded_mantissa&mantissa_mask;
58 value |= UInt64(biased_exponent)<<bits.mantissa;
59 value |= UInt64(sign)<<(bits.mantissa+bits.exponent);
65 // exponent = log_2(bits)*3-7
66 BinFloat::Bits::Bits(unsigned bits):
67 exponent(log(bits)*4.3281-7),
68 mantissa(bits-exponent-1)
71 } // namespace DataFile