28 unsigned int negative:1;
29 unsigned int exponent:11;
31 unsigned int mantissa0:20;
32 unsigned int mantissa1:32;
35 unsigned int negative:1;
36 unsigned int exponent:11;
38 unsigned int quiet_nan:1;
40 unsigned int mantissa0:19;
41 unsigned int mantissa1:32;
45 #define IEEE754_DOUBLE_BIAS 0x3ff
65 const int ieee754_double_bias = 0x3ff;
66 const int ieee754_double_exponent_bits = 11;
67 const int ieee754_double_mantissa0_bits = 20;
68 const int ieee754_double_mantissa1_bits = 32;
75 const int packdest_bits = std::numeric_limits<Packdest>::digits;
79 const Packdest high_packdest_bit = (1U << (packdest_bits - 1));
81 const Packdest ieee754_double_exponent_mask =
82 (1U << ieee754_double_exponent_bits) - 1;
92 int max_int (
int nbits)
94 return ((1U << nbits) >> 1) - 1;
105 int min_int (
int nbits)
107 return static_cast<int>(~0U << nbits) >> 1;
119 void renormalize_denormal (
int& exponent,
123 exponent -= packdest_bits;
125 while ((mantissa & high_packdest_bit) == 0) {
147 void underflow_to_denormal (
int min_exp,
152 if (exponent <= min_exp) {
153 Packdest mantissa_in = mantissa;
156 mantissa = (mantissa >> 1) | high_packdest_bit;
159 int shift = min_exp - exponent;
160 if (shift < packdest_bits)
179 int orig_pos = packdest_bits - round_bits + shift;
180 if (orig_pos < packdest_bits &&
181 ((
static_cast<Packdest
> (1) << orig_pos) & mantissa_in) != 0)
183 Packdest lsb = (
static_cast<Packdest
> (1) <<
184 (packdest_bits - round_bits));
185 Packdest lsbmask = ~ (lsb - 1);
189 if ((mantissa & lsbmask) != lsbmask)
218 : m_nmantissa (nmantissa),
220 m_is_signed (is_signed),
256 if (m_npack < 1 || m_npack > nbits)
257 throw std::runtime_error (
"Bad number of mantissa bits.");
279 if (
d.i[0] == 0 &&
d.i[1] == 0)
283 if (
d.d.ieee.exponent == ieee754_double_exponent_mask) {
285 std::ostringstream
os;
286 os <<
"Bad float number: " <<
src <<
" (" << std::setbase(16) <<
d.i[0]
287 <<
" " <<
d.i[1] <<
")";
296 bool was_negative =
false;
297 if (
d.d.ieee.negative != 0) {
304 if (
d.d.d < 0 &&
err) {
305 std::ostringstream
os;
306 os <<
"Float overflow during packing: " <<
src;
316 if (
d.i[0] == 0 &&
d.i[1] == 0) {
326 (
d.d.ieee.mantissa0 << (packdest_bits -
327 ieee754_double_mantissa0_bits)) |
328 (
d.d.ieee.mantissa1 >>
329 (ieee754_double_mantissa1_bits -
330 (packdest_bits - ieee754_double_mantissa0_bits)));
334 static_cast<int> (
d.d.ieee.exponent) - ieee754_double_bias;
342 roundbit = (mantissa & (lsbmask >> 1));
343 roundmask = ~ static_cast<Packdest> (roundbit - 1);
346 roundbit = (
d.d.ieee.mantissa1 &
347 ((1 << ((ieee754_double_mantissa1_bits -
349 ieee754_double_mantissa0_bits)) - 1))));
350 roundmask = ~ static_cast<Packdest> (0);
355 if ((mantissa & roundmask) == roundmask) {
357 mantissa |= roundmask;
368 std::ostringstream
os;
369 os <<
"Float overflow during packing: " <<
src;
373 mantissa =
static_cast<Packdest> (~0);
377 if (exponent == - ieee754_double_bias)
378 renormalize_denormal (exponent, mantissa);
412 bool was_negative =
false;
442 dd.ieee.negative = 1;
446 renormalize_denormal (exponent, mantissa);
450 if (exponent >= max_int (ieee754_double_exponent_bits)) {
452 std::ostringstream
os;
453 os <<
"Overflow while unpacking float; exponent: " << exponent;
456 exponent = max_int (ieee754_double_exponent_bits) + 1;
461 underflow_to_denormal ( - ieee754_double_bias, 0,
465 dd.ieee.negative = was_negative ? 1 : 0;
466 dd.ieee.exponent = exponent + ieee754_double_bias;
468 (mantissa >> (packdest_bits - ieee754_double_mantissa0_bits));
470 (mantissa << (ieee754_double_mantissa0_bits -
471 (packdest_bits - ieee754_double_mantissa1_bits)));