1 ///////////////////////////////////////////////////////////////
2 // Copyright 2013 John Maddock. Distributed under the Boost
3 // Software License, Version 1.0. (See accompanying file
4 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_
6 #ifndef BOOST_MP_CPP_BIN_FLOAT_IO_HPP
7 #define BOOST_MP_CPP_BIN_FLOAT_IO_HPP
9 namespace boost{ namespace multiprecision{ namespace cpp_bf_io_detail{
13 #pragma warning(disable:4127) // conditional expression is constant
18 // Multiplies a by b and shifts the result so it fits inside max_bits bits,
19 // returns by how much the result was shifted.
22 inline I restricted_multiply(cpp_int& result, const cpp_int& a, const cpp_int& b, I max_bits, boost::int64_t& error)
29 rshift = gb - max_bits;
32 // The error rate increases by the error of both a and b,
33 // this may be overly pessimistic in many case as we're assuming
34 // that a and b have the same level of uncertainty...
36 error = error ? error * 2 : 1;
39 BOOST_ASSERT(rshift < INT_MAX);
40 if(bit_test(result, static_cast<unsigned>(rshift - 1)))
49 if((roundup == 2) || ((roundup == 1) && (result.backend().limbs()[0] & 1)))
55 // Computes a^e shifted to the right so it fits in max_bits, returns how far
56 // to the right we are shifted.
59 inline I restricted_pow(cpp_int& result, const cpp_int& a, I e, I max_bits, boost::int64_t& error)
61 BOOST_ASSERT(&result != &a);
70 return restricted_multiply(result, a, a, max_bits, error);
74 exp = restricted_multiply(result, a, a, max_bits, error);
75 exp += restricted_multiply(result, result, a, max_bits, error);
79 exp = restricted_pow(result, a, p, max_bits, error);
81 exp += restricted_multiply(result, result, result, max_bits, error);
83 exp += restricted_multiply(result, result, a, max_bits, error);
87 inline int get_round_mode(const cpp_int& what, boost::int64_t location, boost::int64_t error)
90 // Can we round what at /location/, if the error in what is /error/ in
91 // units of 0.5ulp. Return:
98 BOOST_ASSERT(location >= 0);
99 BOOST_ASSERT(location < INT_MAX);
100 boost::int64_t error_radius = error & 1 ? (1 + error) / 2 : error / 2;
101 if(error_radius && ((int)msb(error_radius) >= location))
103 if(bit_test(what, static_cast<unsigned>(location)))
105 if((int)lsb(what) == location)
106 return error ? -1 : 1; // Either a tie or can't round depending on whether we have any error
108 return 2; // no error, round up.
109 cpp_int t = what - error_radius;
110 if((int)lsb(t) >= location)
116 cpp_int t = what + error_radius;
117 return bit_test(t, static_cast<unsigned>(location)) ? -1 : 0;
122 inline int get_round_mode(cpp_int& r, cpp_int& d, boost::int64_t error, const cpp_int& q)
125 // Lets suppose we have an inexact division by d+delta, where the true
126 // value for the divisor is d, and with |delta| <= error/2, then
127 // we have calculated q and r such that:
130 // --- = q + -----------
131 // d + error d + error
133 // Rearranging for n / d we get:
136 // --- = q + -------------
139 // So rounding depends on whether 2r + error * q > d.
145 // -1 = couldn't decide.
148 int c = r.compare(d);
150 return error ? -1 : 1;
156 return r.compare(d) > 0 ? 2 : -1;
163 return r.compare(d) < 0 ? 0 : -1;
172 template <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>
173 cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::operator=(const char *s)
176 boost::intmax_t decimal_exp = 0;
177 boost::intmax_t digits_seen = 0;
178 static const boost::intmax_t max_digits_seen = 4 + (cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count * 301L) / 1000;
191 // Special cases first:
193 if((std::strcmp(s, "nan") == 0) || (std::strcmp(s, "NaN") == 0) || (std::strcmp(s, "NAN") == 0))
195 return *this = std::numeric_limits<number<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::quiet_NaN().backend();
197 if((std::strcmp(s, "inf") == 0) || (std::strcmp(s, "Inf") == 0) || (std::strcmp(s, "INF") == 0) || (std::strcmp(s, "infinity") == 0) || (std::strcmp(s, "Infinity") == 0) || (std::strcmp(s, "INFINITY") == 0))
199 *this = std::numeric_limits<number<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::infinity().backend();
205 // Digits before the point:
207 while(*s && (*s >= '0') && (*s <= '9'))
211 if(digits_seen || (*s != '0'))
215 // The decimal point (we really should localise this!!)
216 if(*s && (*s == '.'))
219 // Digits after the point:
221 while(*s && (*s >= '0') && (*s <= '9'))
226 if(digits_seen || (*s != '0'))
229 if(digits_seen > max_digits_seen)
233 // Digits we're skipping:
235 while(*s && (*s >= '0') && (*s <= '9'))
238 // See if there's an exponent:
240 if(*s && ((*s == 'e') || (*s == 'E')))
243 boost::intmax_t e = 0;
245 if(*s && (*s == '-'))
250 else if(*s && (*s == '+'))
252 while(*s && (*s >= '0') && (*s <= '9'))
265 // Oops unexpected input at the end of the number:
267 BOOST_THROW_EXCEPTION(std::runtime_error("Unable to parse string as a valid floating point number."));
271 // Result is necessarily zero:
272 *this = static_cast<limb_type>(0u);
276 static const unsigned limb_bits = sizeof(limb_type) * CHAR_BIT;
278 // Set our working precision - this is heuristic based, we want
279 // a value as small as possible > cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count to avoid large computations
280 // and excessive memory usage, but we also want to avoid having to
281 // up the computation and start again at a higher precision.
282 // So we round cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count up to the nearest whole number of limbs, and add
283 // one limb for good measure. This works very well for small exponents,
284 // but for larger exponents we may may need to restart, we could add some
285 // extra precision right from the start for larger exponents, but this
286 // seems to be slightly slower in the *average* case:
288 #ifdef BOOST_MP_STRESS_IO
289 boost::intmax_t max_bits = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count + 32;
291 boost::intmax_t max_bits = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count + ((cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count % limb_bits) ? (limb_bits - cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count % limb_bits) : 0) + limb_bits;
293 boost::int64_t error = 0;
294 boost::intmax_t calc_exp = 0;
295 boost::intmax_t final_exponent = 0;
299 // Nice and simple, the result is an integer...
305 calc_exp = boost::multiprecision::cpp_bf_io_detail::restricted_pow(t, cpp_int(5), decimal_exp, max_bits, error);
306 calc_exp += boost::multiprecision::cpp_bf_io_detail::restricted_multiply(t, t, n, max_bits, error);
310 final_exponent = (boost::int64_t)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - 1 + decimal_exp + calc_exp;
311 int rshift = msb(t) - cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count + 1;
314 final_exponent += rshift;
315 int roundup = boost::multiprecision::cpp_bf_io_detail::get_round_mode(t, rshift - 1, error);
317 if((roundup == 2) || ((roundup == 1) && t.backend().limbs()[0] & 1))
321 #ifdef BOOST_MP_STRESS_IO
332 BOOST_ASSERT(!error);
334 if(final_exponent > cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent)
336 exponent() = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent;
337 final_exponent -= cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent;
339 else if(final_exponent < cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::min_exponent)
342 exponent() = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::min_exponent;
343 final_exponent -= cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::min_exponent;
347 exponent() = static_cast<Exponent>(final_exponent);
350 copy_and_round(*this, t.backend());
360 // Result is the ratio of two integers: we need to organise the
361 // division so as to produce at least an N-bit result which we can
362 // round according to the remainder.
363 //cpp_int d = pow(cpp_int(5), -decimal_exp);
367 calc_exp = boost::multiprecision::cpp_bf_io_detail::restricted_pow(d, cpp_int(5), -decimal_exp, max_bits, error);
368 int shift = (int)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - msb(n) + msb(d);
369 final_exponent = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - 1 + decimal_exp - calc_exp;
373 final_exponent -= static_cast<Exponent>(shift);
376 divide_qr(n, d, q, r);
378 BOOST_ASSERT((gb >= static_cast<int>(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count) - 1));
380 // Check for rounding conditions we have to
384 if(gb == cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - 1)
386 // Exactly the right number of bits, use the remainder to round:
387 roundup = boost::multiprecision::cpp_bf_io_detail::get_round_mode(r, d, error, q);
389 else if(bit_test(q, gb - (int)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count) && ((int)lsb(q) == (gb - (int)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count)))
391 // Too many bits in q and the bits in q indicate a tie, but we can break that using r,
392 // note that the radius of error in r is error/2 * q:
393 int lshift = gb - (int)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count + 1;
395 final_exponent += static_cast<Exponent>(lshift);
396 BOOST_ASSERT((msb(q) >= cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - 1));
397 if(error && (r < (error / 2) * q))
399 else if(error && (r + (error / 2) * q >= d))
404 else if(error && (((error / 2) * q + r >= d) || (r < (error / 2) * q)))
406 // We might have been rounding up, or got the wrong quotient: can't tell!
411 #ifdef BOOST_MP_STRESS_IO
420 final_exponent += static_cast<Exponent>(shift);
424 else if((roundup == 2) || ((roundup == 1) && q.backend().limbs()[0] & 1))
426 if(final_exponent > cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent)
429 exponent() = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent;
430 final_exponent -= cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent;
432 else if(final_exponent < cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::min_exponent)
435 exponent() = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::min_exponent;
436 final_exponent -= cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::min_exponent;
440 exponent() = static_cast<Exponent>(final_exponent);
443 copy_and_round(*this, q.backend());
451 // Check for scaling and/or over/under-flow:
453 final_exponent += exponent();
454 if(final_exponent > cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent)
457 exponent() = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_infinity;
458 bits() = limb_type(0);
460 else if(final_exponent < cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::min_exponent)
463 exponent() = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero;
464 bits() = limb_type(0);
469 exponent() = static_cast<Exponent>(final_exponent);
474 template <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>
475 std::string cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::str(std::streamsize dig, std::ios_base::fmtflags f) const
478 dig = std::numeric_limits<number<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::max_digits10;
480 bool scientific = (f & std::ios_base::scientific) == std::ios_base::scientific;
481 bool fixed = !scientific && (f & std::ios_base::fixed);
485 if(exponent() <= cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent)
487 // How far to left-shift in order to demormalise the mantissa:
488 boost::intmax_t shift = (int)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - exponent() - 1;
489 boost::intmax_t digits_wanted = static_cast<int>(dig);
490 boost::intmax_t base10_exp = exponent() >= 0 ? static_cast<boost::intmax_t>(std::floor(0.30103 * exponent())) : static_cast<boost::intmax_t>(std::ceil(0.30103 * exponent()));
492 // For fixed formatting we want /dig/ digits after the decimal point,
493 // so if the exponent is zero, allowing for the one digit before the
494 // decimal point, we want 1 + dig digits etc.
497 digits_wanted += 1 + base10_exp;
500 if(digits_wanted < -1)
502 // Fixed precision, no significant digits, and nothing to round!
505 s.insert(static_cast<std::string::size_type>(0), 1, '-');
506 boost::multiprecision::detail::format_float_string(s, base10_exp, dig, f, true);
510 // power10 is the base10 exponent we need to multiply/divide by in order
511 // to convert our denormalised number to an integer with the right number of digits:
513 boost::intmax_t power10 = digits_wanted - base10_exp - 1;
515 // If we calculate 5^power10 rather than 10^power10 we need to move
516 // 2^power10 into /shift/
520 int roundup = 0; // 0=no rounding, 1=tie, 2=up
521 static const unsigned limb_bits = sizeof(limb_type) * CHAR_BIT;
523 // Set our working precision - this is heuristic based, we want
524 // a value as small as possible > cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count to avoid large computations
525 // and excessive memory usage, but we also want to avoid having to
526 // up the computation and start again at a higher precision.
527 // So we round cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count up to the nearest whole number of limbs, and add
528 // one limb for good measure. This works very well for small exponents,
529 // but for larger exponents we add a few extra limbs to max_bits:
531 #ifdef BOOST_MP_STRESS_IO
532 boost::intmax_t max_bits = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count + 32;
534 boost::intmax_t max_bits = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count + ((cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count % limb_bits) ? (limb_bits - cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count % limb_bits) : 0) + limb_bits;
536 max_bits += (msb(boost::multiprecision::detail::abs(power10)) / 8) * limb_bits;
540 boost::int64_t error = 0;
541 boost::intmax_t calc_exp = 0;
543 // Our integer result is: bits() * 2^-shift * 5^power10
550 // We go straight to the answer with all integer arithmetic,
551 // the result is always exact and never needs rounding:
552 BOOST_ASSERT(power10 <= (boost::intmax_t)INT_MAX);
555 i *= pow(cpp_int(5), static_cast<unsigned>(power10));
560 calc_exp = boost::multiprecision::cpp_bf_io_detail::restricted_pow(d, cpp_int(5), -power10, max_bits, error);
562 BOOST_ASSERT(shift < 0); // Must still be true!
565 divide_qr(i, d, i, r);
566 roundup = boost::multiprecision::cpp_bf_io_detail::get_round_mode(r, d, error, i);
569 #ifdef BOOST_MP_STRESS_IO
574 shift = (int)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - exponent() - 1 - power10;
582 // Our integer is bits() * 2^-shift * 10^power10
589 calc_exp = boost::multiprecision::cpp_bf_io_detail::restricted_pow(t, cpp_int(5), power10, max_bits, error);
590 calc_exp += boost::multiprecision::cpp_bf_io_detail::restricted_multiply(i, i, t, max_bits, error);
593 if((shift < 0) || ((shift == 0) && error))
595 // We only get here if we were asked for a crazy number of decimal digits -
596 // more than are present in a 2^max_bits number.
597 #ifdef BOOST_MP_STRESS_IO
602 shift = (int)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - exponent() - 1 - power10;
607 roundup = boost::multiprecision::cpp_bf_io_detail::get_round_mode(i, shift - 1, error);
610 #ifdef BOOST_MP_STRESS_IO
615 shift = (int)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - exponent() - 1 - power10;
623 // We're right shifting, *and* dividing by 5^-power10,
624 // so 5^-power10 can never be that large or we'd simply
625 // get zero as a result, and that case is already handled above:
627 BOOST_ASSERT(-power10 < INT_MAX);
628 cpp_int d = pow(cpp_int(5), static_cast<unsigned>(-power10));
630 divide_qr(i, d, i, r);
632 int c = r.compare(d);
633 roundup = c < 0 ? 0 : c == 0 ? 1 : 2;
636 s = i.str(0, std::ios_base::fmtflags(0));
638 // Check if we got the right number of digits, this
639 // is really a test of whether we calculated the
640 // decimal exponent correctly:
642 boost::intmax_t digits_got = i ? static_cast<boost::intmax_t>(s.size()) : 0;
643 if(digits_got != digits_wanted)
645 base10_exp += digits_got - digits_wanted;
647 digits_wanted = digits_got; // strange but true.
648 power10 = digits_wanted - base10_exp - 1;
649 shift = (int)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - exponent() - 1 - power10;
659 // Check whether we need to round up: note that we could equally round up
660 // the integer /i/ above, but since we need to perform the rounding *after*
661 // the conversion to a string and the digit count check, we might as well
664 if((roundup == 2) || ((roundup == 1) && ((s[s.size() - 1] - '0') & 1)))
666 boost::multiprecision::detail::round_string_up_at(s, static_cast<int>(s.size() - 1), base10_exp);
670 s.insert(static_cast<std::string::size_type>(0), 1, '-');
672 boost::multiprecision::detail::format_float_string(s, base10_exp, dig, f, false);
679 s = sign() ? "-0" : f & std::ios_base::showpos ? "+0" : "0";
680 boost::multiprecision::detail::format_float_string(s, 0, dig, f, true);
685 case exponent_infinity:
686 s = sign() ? "-inf" : f & std::ios_base::showpos ? "+inf" : "inf";