27 unsigned int negative:1;
28 unsigned int exponent:11;
30 unsigned int mantissa0:20;
31 unsigned int mantissa1:32;
34 unsigned int negative:1;
35 unsigned int exponent:11;
37 unsigned int quiet_nan:1;
39 unsigned int mantissa0:19;
40 unsigned int mantissa1:32;
44 #define IEEE754_DOUBLE_BIAS 0x3ff
64 const int ieee754_double_bias = 0x3ff;
65 const int ieee754_double_exponent_bits = 11;
66 const int ieee754_double_mantissa0_bits = 20;
67 const int ieee754_double_mantissa1_bits = 32;
74 const int packdest_bits = std::numeric_limits<Packdest>::digits;
78 const Packdest high_packdest_bit = (1U << (packdest_bits - 1));
80 const Packdest ieee754_double_exponent_mask =
81 (1U << ieee754_double_exponent_bits) - 1;
91 int max_int (
int nbits)
93 return ((1U << nbits) >> 1) - 1;
104 int min_int (
int nbits)
106 return static_cast<int>(~0U << nbits) >> 1;
118 void renormalize_denormal (
int& exponent,
122 exponent -= packdest_bits;
124 while ((mantissa & high_packdest_bit) == 0) {
146 void underflow_to_denormal (
int min_exp,
151 if (exponent <= min_exp) {
152 Packdest mantissa_in = mantissa;
155 mantissa = (mantissa >> 1) | high_packdest_bit;
158 int shift = min_exp - exponent;
159 if (shift < packdest_bits)
178 int orig_pos = packdest_bits - round_bits + shift;
179 if (orig_pos < packdest_bits &&
180 ((
static_cast<Packdest
> (1) << orig_pos) & mantissa_in) != 0)
182 Packdest lsb = (
static_cast<Packdest
> (1) <<
183 (packdest_bits - round_bits));
184 Packdest lsbmask = ~ (lsb - 1);
188 if ((mantissa & lsbmask) != lsbmask)
217 : m_nmantissa (nmantissa),
219 m_is_signed (is_signed),
255 if (m_npack < 1 || m_npack > nbits)
256 throw std::runtime_error (
"Bad number of mantissa bits.");
278 if (
d.i[0] == 0 &&
d.i[1] == 0)
282 if (
d.d.ieee.exponent == ieee754_double_exponent_mask) {
284 std::ostringstream
os;
285 os <<
"Bad float number: " <<
src <<
" (" << std::setbase(16) <<
d.i[0]
286 <<
" " <<
d.i[1] <<
")";
295 bool was_negative =
false;
296 if (
d.d.ieee.negative != 0) {
303 if (
d.d.d < 0 &&
err) {
304 std::ostringstream
os;
305 os <<
"Float overflow during packing: " <<
src;
315 if (
d.i[0] == 0 &&
d.i[1] == 0) {
325 (
d.d.ieee.mantissa0 << (packdest_bits -
326 ieee754_double_mantissa0_bits)) |
327 (
d.d.ieee.mantissa1 >>
328 (ieee754_double_mantissa1_bits -
329 (packdest_bits - ieee754_double_mantissa0_bits)));
333 static_cast<int> (
d.d.ieee.exponent) - ieee754_double_bias;
341 roundbit = (mantissa & (lsbmask >> 1));
342 roundmask = ~ static_cast<Packdest> (roundbit - 1);
345 roundbit = (
d.d.ieee.mantissa1 &
346 ((1 << ((ieee754_double_mantissa1_bits -
348 ieee754_double_mantissa0_bits)) - 1))));
349 roundmask = ~ static_cast<Packdest> (0);
354 if ((mantissa & roundmask) == roundmask) {
356 mantissa |= roundmask;
367 std::ostringstream
os;
368 os <<
"Float overflow during packing: " <<
src;
372 mantissa =
static_cast<Packdest> (~0);
376 if (exponent == - ieee754_double_bias)
377 renormalize_denormal (exponent, mantissa);
411 bool was_negative =
false;
441 dd.ieee.negative = 1;
445 renormalize_denormal (exponent, mantissa);
449 if (exponent >= max_int (ieee754_double_exponent_bits)) {
451 std::ostringstream
os;
452 os <<
"Overflow while unpacking float; exponent: " << exponent;
455 exponent = max_int (ieee754_double_exponent_bits) + 1;
460 underflow_to_denormal ( - ieee754_double_bias, 0,
464 dd.ieee.negative = was_negative ? 1 : 0;
465 dd.ieee.exponent = exponent + ieee754_double_bias;
467 (mantissa >> (packdest_bits - ieee754_double_mantissa0_bits));
469 (mantissa << (ieee754_double_mantissa0_bits -
470 (packdest_bits - ieee754_double_mantissa1_bits)));