Imported Upstream version 1.72.0
[platform/upstream/boost.git] / boost / multiprecision / cpp_dec_float.hpp
1 ///////////////////////////////////////////////////////////////////////////////
2 // Copyright Christopher Kormanyos 2002 - 2013.
3 // Copyright 2011 -2013 John Maddock. Distributed under the Boost
4 // Software License, Version 1.0. (See accompanying file
5 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 //
7 // This work is based on an earlier work:
8 // "Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations",
9 // in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469
10 //
11 // Note that there are no "noexcept" specifications on the functions in this file: there are too many
12 // calls to lexical_cast (and similar) to easily analyse the code for correctness. So until compilers
13 // can detect noexcept misuse at compile time, the only realistic option is to simply not use it here.
14 //
15
16 #ifndef BOOST_MP_CPP_DEC_FLOAT_BACKEND_HPP
17 #define BOOST_MP_CPP_DEC_FLOAT_BACKEND_HPP
18
19 #include <boost/config.hpp>
20 #include <boost/cstdint.hpp>
21 #include <limits>
22 #ifndef BOOST_NO_CXX11_HDR_ARRAY
23 #include <array>
24 #else
25 #include <boost/array.hpp>
26 #endif
27 #include <boost/cstdint.hpp>
28 #include <boost/functional/hash_fwd.hpp>
29 #include <boost/multiprecision/number.hpp>
30 #include <boost/multiprecision/detail/big_lanczos.hpp>
31 #include <boost/multiprecision/detail/dynamic_array.hpp>
32
33 //
34 // Headers required for Boost.Math integration:
35 //
36 #include <boost/math/policies/policy.hpp>
37 //
38 // Some includes we need from Boost.Math, since we rely on that library to provide these functions:
39 //
40 #include <boost/math/special_functions/asinh.hpp>
41 #include <boost/math/special_functions/acosh.hpp>
42 #include <boost/math/special_functions/atanh.hpp>
43 #include <boost/math/special_functions/cbrt.hpp>
44 #include <boost/math/special_functions/expm1.hpp>
45 #include <boost/math/special_functions/gamma.hpp>
46
47 #ifdef BOOST_MSVC
48 #pragma warning(push)
49 #pragma warning(disable : 6326) // comparison of two constants
50 #endif
51
52 namespace boost {
53 namespace multiprecision {
54 namespace backends {
55
56 template <unsigned Digits10, class ExponentType = boost::int32_t, class Allocator = void>
57 class cpp_dec_float;
58
59 } // namespace backends
60
61 template <unsigned Digits10, class ExponentType, class Allocator>
62 struct number_category<backends::cpp_dec_float<Digits10, ExponentType, Allocator> > : public mpl::int_<number_kind_floating_point>
63 {};
64
65 namespace backends {
66
67 template <unsigned Digits10, class ExponentType, class Allocator>
68 class cpp_dec_float
69 {
70  private:
71    static const boost::int32_t cpp_dec_float_digits10_setting = Digits10;
72
73    // We need at least 16-bits in the exponent type to do anything sensible:
74    BOOST_STATIC_ASSERT_MSG(boost::is_signed<ExponentType>::value, "ExponentType must be a signed built in integer type.");
75    BOOST_STATIC_ASSERT_MSG(sizeof(ExponentType) > 1, "ExponentType is too small.");
76
77  public:
78    typedef mpl::list<boost::long_long_type>  signed_types;
79    typedef mpl::list<boost::ulong_long_type> unsigned_types;
80    typedef mpl::list<long double>            float_types;
81    typedef ExponentType                      exponent_type;
82
83    static const boost::int32_t cpp_dec_float_radix             = 10L;
84    static const boost::int32_t cpp_dec_float_digits10_limit_lo = 9L;
85    static const boost::int32_t cpp_dec_float_digits10_limit_hi = boost::integer_traits<boost::int32_t>::const_max - 100;
86    static const boost::int32_t cpp_dec_float_digits10          = ((cpp_dec_float_digits10_setting < cpp_dec_float_digits10_limit_lo) ? cpp_dec_float_digits10_limit_lo : ((cpp_dec_float_digits10_setting > cpp_dec_float_digits10_limit_hi) ? cpp_dec_float_digits10_limit_hi : cpp_dec_float_digits10_setting));
87    static const ExponentType   cpp_dec_float_max_exp10         = (static_cast<ExponentType>(1) << (std::numeric_limits<ExponentType>::digits - 5));
88    static const ExponentType   cpp_dec_float_min_exp10         = -cpp_dec_float_max_exp10;
89    static const ExponentType   cpp_dec_float_max_exp           = cpp_dec_float_max_exp10;
90    static const ExponentType   cpp_dec_float_min_exp           = cpp_dec_float_min_exp10;
91
92    BOOST_STATIC_ASSERT((cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_max_exp10 == -cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_min_exp10));
93
94  private:
95    static const boost::int32_t cpp_dec_float_elem_digits10 = 8L;
96    static const boost::int32_t cpp_dec_float_elem_mask     = 100000000L;
97
98    BOOST_STATIC_ASSERT(0 == cpp_dec_float_max_exp10 % cpp_dec_float_elem_digits10);
99
100    // There are three guard limbs.
101    // 1) The first limb has 'play' from 1...8 decimal digits.
102    // 2) The last limb also has 'play' from 1...8 decimal digits.
103    // 3) One limb can get lost when justifying after multiply,
104    // as only half of the triangle is multiplied and a carry
105    // from below is missing.
106    static const boost::int32_t cpp_dec_float_elem_number_request = static_cast<boost::int32_t>((cpp_dec_float_digits10 / cpp_dec_float_elem_digits10) + (((cpp_dec_float_digits10 % cpp_dec_float_elem_digits10) != 0) ? 1 : 0));
107
108    // The number of elements needed (with a minimum of two) plus three added guard limbs.
109    static const boost::int32_t cpp_dec_float_elem_number = static_cast<boost::int32_t>(((cpp_dec_float_elem_number_request < 2L) ? 2L : cpp_dec_float_elem_number_request) + 3L);
110
111  public:
112    static const boost::int32_t cpp_dec_float_total_digits10 = static_cast<boost::int32_t>(cpp_dec_float_elem_number * cpp_dec_float_elem_digits10);
113
114  private:
115    typedef enum enum_fpclass_type
116    {
117       cpp_dec_float_finite,
118       cpp_dec_float_inf,
119       cpp_dec_float_NaN
120    } fpclass_type;
121
122 #ifndef BOOST_NO_CXX11_HDR_ARRAY
123    typedef typename mpl::if_<is_void<Allocator>,
124                              std::array<boost::uint32_t, cpp_dec_float_elem_number>,
125                              detail::dynamic_array<boost::uint32_t, cpp_dec_float_elem_number, Allocator> >::type array_type;
126 #else
127    typedef typename mpl::if_<is_void<Allocator>,
128                              boost::array<boost::uint32_t, cpp_dec_float_elem_number>,
129                              detail::dynamic_array<boost::uint32_t, cpp_dec_float_elem_number, Allocator> >::type array_type;
130 #endif
131
132    array_type     data;
133    ExponentType   exp;
134    bool           neg;
135    fpclass_type   fpclass;
136    boost::int32_t prec_elem;
137
138    //
139    // Special values constructor:
140    //
141    cpp_dec_float(fpclass_type c) : data(),
142                                    exp(static_cast<ExponentType>(0)),
143                                    neg(false),
144                                    fpclass(c),
145                                    prec_elem(cpp_dec_float_elem_number) {}
146
147    //
148    // Static data initializer:
149    //
150    struct initializer
151    {
152       initializer()
153       {
154          cpp_dec_float<Digits10, ExponentType, Allocator>::nan();
155          cpp_dec_float<Digits10, ExponentType, Allocator>::inf();
156          (cpp_dec_float<Digits10, ExponentType, Allocator>::min)();
157          (cpp_dec_float<Digits10, ExponentType, Allocator>::max)();
158          cpp_dec_float<Digits10, ExponentType, Allocator>::zero();
159          cpp_dec_float<Digits10, ExponentType, Allocator>::one();
160          cpp_dec_float<Digits10, ExponentType, Allocator>::two();
161          cpp_dec_float<Digits10, ExponentType, Allocator>::half();
162          cpp_dec_float<Digits10, ExponentType, Allocator>::double_min();
163          cpp_dec_float<Digits10, ExponentType, Allocator>::double_max();
164          cpp_dec_float<Digits10, ExponentType, Allocator>::long_double_max();
165          cpp_dec_float<Digits10, ExponentType, Allocator>::long_double_min();
166          cpp_dec_float<Digits10, ExponentType, Allocator>::long_long_max();
167          cpp_dec_float<Digits10, ExponentType, Allocator>::long_long_min();
168          cpp_dec_float<Digits10, ExponentType, Allocator>::ulong_long_max();
169          cpp_dec_float<Digits10, ExponentType, Allocator>::eps();
170          cpp_dec_float<Digits10, ExponentType, Allocator>::pow2(0);
171       }
172       void do_nothing() {}
173    };
174
175    static initializer init;
176
177  public:
178    // Constructors
179    cpp_dec_float() BOOST_MP_NOEXCEPT_IF(noexcept(array_type())) : data(),
180                                                                   exp(static_cast<ExponentType>(0)),
181                                                                   neg(false),
182                                                                   fpclass(cpp_dec_float_finite),
183                                                                   prec_elem(cpp_dec_float_elem_number) {}
184
185    cpp_dec_float(const char* s) : data(),
186                                   exp(static_cast<ExponentType>(0)),
187                                   neg(false),
188                                   fpclass(cpp_dec_float_finite),
189                                   prec_elem(cpp_dec_float_elem_number)
190    {
191       *this = s;
192    }
193
194    template <class I>
195    cpp_dec_float(I i, typename enable_if<is_unsigned<I> >::type* = 0) : data(),
196                                                                         exp(static_cast<ExponentType>(0)),
197                                                                         neg(false),
198                                                                         fpclass(cpp_dec_float_finite),
199                                                                         prec_elem(cpp_dec_float_elem_number)
200    {
201       from_unsigned_long_long(i);
202    }
203
204    template <class I>
205    cpp_dec_float(I i, typename enable_if<is_signed<I> >::type* = 0) : data(),
206                                                                       exp(static_cast<ExponentType>(0)),
207                                                                       neg(false),
208                                                                       fpclass(cpp_dec_float_finite),
209                                                                       prec_elem(cpp_dec_float_elem_number)
210    {
211       if (i < 0)
212       {
213          from_unsigned_long_long(boost::multiprecision::detail::unsigned_abs(i));
214          negate();
215       }
216       else
217          from_unsigned_long_long(i);
218    }
219
220    cpp_dec_float(const cpp_dec_float& f) BOOST_MP_NOEXCEPT_IF(noexcept(array_type(std::declval<const array_type&>()))) : data(f.data),
221                                                                                                                          exp(f.exp),
222                                                                                                                          neg(f.neg),
223                                                                                                                          fpclass(f.fpclass),
224                                                                                                                          prec_elem(f.prec_elem) {}
225
226    template <unsigned D, class ET, class A>
227    cpp_dec_float(const cpp_dec_float<D, ET, A>& f, typename enable_if_c<D <= Digits10>::type* = 0) : data(),
228                                                                                                      exp(f.exp),
229                                                                                                      neg(f.neg),
230                                                                                                      fpclass(static_cast<fpclass_type>(static_cast<int>(f.fpclass))),
231                                                                                                      prec_elem(cpp_dec_float_elem_number)
232    {
233       std::copy(f.data.begin(), f.data.begin() + f.prec_elem, data.begin());
234    }
235    template <unsigned D, class ET, class A>
236    explicit cpp_dec_float(const cpp_dec_float<D, ET, A>& f, typename disable_if_c<D <= Digits10>::type* = 0) : data(),
237                                                                                                                exp(f.exp),
238                                                                                                                neg(f.neg),
239                                                                                                                fpclass(static_cast<fpclass_type>(static_cast<int>(f.fpclass))),
240                                                                                                                prec_elem(cpp_dec_float_elem_number)
241    {
242       // TODO: this doesn't round!
243       std::copy(f.data.begin(), f.data.begin() + prec_elem, data.begin());
244    }
245
246    template <class F>
247    cpp_dec_float(const F val, typename enable_if_c<is_floating_point<F>::value
248 #ifdef BOOST_HAS_FLOAT128
249                                                    && !boost::is_same<F, __float128>::value
250 #endif
251                                                    >::type* = 0) : data(),
252                                                                    exp(static_cast<ExponentType>(0)),
253                                                                    neg(false),
254                                                                    fpclass(cpp_dec_float_finite),
255                                                                    prec_elem(cpp_dec_float_elem_number)
256    {
257       *this = val;
258    }
259
260    cpp_dec_float(const double mantissa, const ExponentType exponent);
261
262    std::size_t hash() const
263    {
264       std::size_t result = 0;
265       for (int i = 0; i < prec_elem; ++i)
266          boost::hash_combine(result, data[i]);
267       boost::hash_combine(result, exp);
268       boost::hash_combine(result, neg);
269       boost::hash_combine(result, fpclass);
270       return result;
271    }
272
273    // Specific special values.
274    static const cpp_dec_float& nan()
275    {
276       static const cpp_dec_float val(cpp_dec_float_NaN);
277       init.do_nothing();
278       return val;
279    }
280
281    static const cpp_dec_float& inf()
282    {
283       static const cpp_dec_float val(cpp_dec_float_inf);
284       init.do_nothing();
285       return val;
286    }
287
288    static const cpp_dec_float&(max)()
289    {
290       init.do_nothing();
291       static cpp_dec_float val_max = std::string("1.0e" + boost::lexical_cast<std::string>(cpp_dec_float_max_exp10)).c_str();
292       return val_max;
293    }
294
295    static const cpp_dec_float&(min)()
296    {
297       init.do_nothing();
298       static cpp_dec_float val_min = std::string("1.0e" + boost::lexical_cast<std::string>(cpp_dec_float_min_exp10)).c_str();
299       return val_min;
300    }
301
302    static const cpp_dec_float& zero()
303    {
304       init.do_nothing();
305       static cpp_dec_float val(static_cast<boost::ulong_long_type>(0u));
306       return val;
307    }
308
309    static const cpp_dec_float& one()
310    {
311       init.do_nothing();
312       static cpp_dec_float val(static_cast<boost::ulong_long_type>(1u));
313       return val;
314    }
315
316    static const cpp_dec_float& two()
317    {
318       init.do_nothing();
319       static cpp_dec_float val(static_cast<boost::ulong_long_type>(2u));
320       return val;
321    }
322
323    static const cpp_dec_float& half()
324    {
325       init.do_nothing();
326       static cpp_dec_float val(0.5L);
327       return val;
328    }
329
330    static const cpp_dec_float& double_min()
331    {
332       init.do_nothing();
333       static cpp_dec_float val(static_cast<long double>((std::numeric_limits<double>::min)()));
334       return val;
335    }
336
337    static const cpp_dec_float& double_max()
338    {
339       init.do_nothing();
340       static cpp_dec_float val(static_cast<long double>((std::numeric_limits<double>::max)()));
341       return val;
342    }
343
344    static const cpp_dec_float& long_double_min()
345    {
346       init.do_nothing();
347 #ifdef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
348       static cpp_dec_float val(static_cast<long double>((std::numeric_limits<double>::min)()));
349 #else
350       static cpp_dec_float val((std::numeric_limits<long double>::min)());
351 #endif
352       return val;
353    }
354
355    static const cpp_dec_float& long_double_max()
356    {
357       init.do_nothing();
358 #ifdef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
359       static cpp_dec_float val(static_cast<long double>((std::numeric_limits<double>::max)()));
360 #else
361       static cpp_dec_float val((std::numeric_limits<long double>::max)());
362 #endif
363       return val;
364    }
365
366    static const cpp_dec_float& long_long_max()
367    {
368       init.do_nothing();
369       static cpp_dec_float val((std::numeric_limits<boost::long_long_type>::max)());
370       return val;
371    }
372
373    static const cpp_dec_float& long_long_min()
374    {
375       init.do_nothing();
376       static cpp_dec_float val((std::numeric_limits<boost::long_long_type>::min)());
377       return val;
378    }
379
380    static const cpp_dec_float& ulong_long_max()
381    {
382       init.do_nothing();
383       static cpp_dec_float val((std::numeric_limits<boost::ulong_long_type>::max)());
384       return val;
385    }
386
387    static const cpp_dec_float& eps()
388    {
389       init.do_nothing();
390       static cpp_dec_float val(1.0, 1 - static_cast<int>(cpp_dec_float_digits10));
391       return val;
392    }
393
394    // Basic operations.
395    cpp_dec_float& operator=(const cpp_dec_float& v) BOOST_MP_NOEXCEPT_IF(noexcept(std::declval<array_type&>() = std::declval<const array_type&>()))
396    {
397       data      = v.data;
398       exp       = v.exp;
399       neg       = v.neg;
400       fpclass   = v.fpclass;
401       prec_elem = v.prec_elem;
402       return *this;
403    }
404
405    template <unsigned D>
406    cpp_dec_float& operator=(const cpp_dec_float<D>& f)
407    {
408       exp            = f.exp;
409       neg            = f.neg;
410       fpclass        = static_cast<enum_fpclass_type>(static_cast<int>(f.fpclass));
411       unsigned elems = (std::min)(f.prec_elem, cpp_dec_float_elem_number);
412       std::copy(f.data.begin(), f.data.begin() + elems, data.begin());
413       std::fill(data.begin() + elems, data.end(), 0);
414       prec_elem = cpp_dec_float_elem_number;
415       return *this;
416    }
417
418    cpp_dec_float& operator=(boost::long_long_type v)
419    {
420       if (v < 0)
421       {
422          from_unsigned_long_long(1u - boost::ulong_long_type(v + 1)); // Avoid undefined behaviour in negation of minimum value for long long
423          negate();
424       }
425       else
426          from_unsigned_long_long(v);
427       return *this;
428    }
429
430    cpp_dec_float& operator=(boost::ulong_long_type v)
431    {
432       from_unsigned_long_long(v);
433       return *this;
434    }
435
436    cpp_dec_float& operator=(long double v);
437
438    cpp_dec_float& operator=(const char* v)
439    {
440       rd_string(v);
441       return *this;
442    }
443
444    cpp_dec_float& operator+=(const cpp_dec_float& v);
445    cpp_dec_float& operator-=(const cpp_dec_float& v);
446    cpp_dec_float& operator*=(const cpp_dec_float& v);
447    cpp_dec_float& operator/=(const cpp_dec_float& v);
448
449    cpp_dec_float& add_unsigned_long_long(const boost::ulong_long_type n)
450    {
451       cpp_dec_float t;
452       t.from_unsigned_long_long(n);
453       return *this += t;
454    }
455
456    cpp_dec_float& sub_unsigned_long_long(const boost::ulong_long_type n)
457    {
458       cpp_dec_float t;
459       t.from_unsigned_long_long(n);
460       return *this -= t;
461    }
462
463    cpp_dec_float& mul_unsigned_long_long(const boost::ulong_long_type n);
464    cpp_dec_float& div_unsigned_long_long(const boost::ulong_long_type n);
465
466    // Elementary primitives.
467    cpp_dec_float& calculate_inv();
468    cpp_dec_float& calculate_sqrt();
469
470    void negate()
471    {
472       if (!iszero())
473          neg = !neg;
474    }
475
476    // Comparison functions
477    bool isnan BOOST_PREVENT_MACRO_SUBSTITUTION() const { return (fpclass == cpp_dec_float_NaN); }
478    bool isinf BOOST_PREVENT_MACRO_SUBSTITUTION() const { return (fpclass == cpp_dec_float_inf); }
479    bool isfinite BOOST_PREVENT_MACRO_SUBSTITUTION() const { return (fpclass == cpp_dec_float_finite); }
480
481    bool iszero() const
482    {
483       return ((fpclass == cpp_dec_float_finite) && (data[0u] == 0u));
484    }
485
486    bool isone() const;
487    bool isint() const;
488    bool isneg() const { return neg; }
489
490    // Operators pre-increment and pre-decrement
491    cpp_dec_float& operator++()
492    {
493       return *this += one();
494    }
495
496    cpp_dec_float& operator--()
497    {
498       return *this -= one();
499    }
500
501    std::string str(boost::intmax_t digits, std::ios_base::fmtflags f) const;
502
503    int compare(const cpp_dec_float& v) const;
504
505    template <class V>
506    int compare(const V& v) const
507    {
508       cpp_dec_float<Digits10, ExponentType, Allocator> t;
509       t = v;
510       return compare(t);
511    }
512
513    void swap(cpp_dec_float& v)
514    {
515       data.swap(v.data);
516       std::swap(exp, v.exp);
517       std::swap(neg, v.neg);
518       std::swap(fpclass, v.fpclass);
519       std::swap(prec_elem, v.prec_elem);
520    }
521
522    double                 extract_double() const;
523    long double            extract_long_double() const;
524    boost::long_long_type  extract_signed_long_long() const;
525    boost::ulong_long_type extract_unsigned_long_long() const;
526    void                   extract_parts(double& mantissa, ExponentType& exponent) const;
527    cpp_dec_float          extract_integer_part() const;
528
529    void precision(const boost::int32_t prec_digits)
530    {
531       if (prec_digits >= cpp_dec_float_total_digits10)
532       {
533          prec_elem = cpp_dec_float_elem_number;
534       }
535       else
536       {
537          const boost::int32_t elems = static_cast<boost::int32_t>(static_cast<boost::int32_t>((prec_digits + (cpp_dec_float_elem_digits10 / 2)) / cpp_dec_float_elem_digits10) + static_cast<boost::int32_t>(((prec_digits % cpp_dec_float_elem_digits10) != 0) ? 1 : 0));
538
539          prec_elem = (std::min)(cpp_dec_float_elem_number, (std::max)(elems, static_cast<boost::int32_t>(2)));
540       }
541    }
542    static cpp_dec_float pow2(boost::long_long_type i);
543    ExponentType         order() const
544    {
545       const bool bo_order_is_zero = ((!(isfinite)()) || (data[0] == static_cast<boost::uint32_t>(0u)));
546       //
547       // Binary search to find the order of the leading term:
548       //
549       ExponentType prefix = 0;
550
551       if (data[0] >= 100000UL)
552       {
553          if (data[0] >= 10000000UL)
554          {
555             if (data[0] >= 100000000UL)
556             {
557                if (data[0] >= 1000000000UL)
558                   prefix = 9;
559                else
560                   prefix = 8;
561             }
562             else
563                prefix = 7;
564          }
565          else
566          {
567             if (data[0] >= 1000000UL)
568                prefix = 6;
569             else
570                prefix = 5;
571          }
572       }
573       else
574       {
575          if (data[0] >= 1000UL)
576          {
577             if (data[0] >= 10000UL)
578                prefix = 4;
579             else
580                prefix = 3;
581          }
582          else
583          {
584             if (data[0] >= 100)
585                prefix = 2;
586             else if (data[0] >= 10)
587                prefix = 1;
588          }
589       }
590
591       return (bo_order_is_zero ? static_cast<ExponentType>(0) : static_cast<ExponentType>(exp + prefix));
592    }
593
594    template <class Archive>
595    void serialize(Archive& ar, const unsigned int /*version*/)
596    {
597       for (unsigned i = 0; i < data.size(); ++i)
598          ar& boost::make_nvp("digit", data[i]);
599       ar& boost::make_nvp("exponent", exp);
600       ar& boost::make_nvp("sign", neg);
601       ar& boost::make_nvp("class-type", fpclass);
602       ar& boost::make_nvp("precision", prec_elem);
603    }
604
605  private:
606    static bool data_elem_is_non_zero_predicate(const boost::uint32_t& d) { return (d != static_cast<boost::uint32_t>(0u)); }
607    static bool data_elem_is_non_nine_predicate(const boost::uint32_t& d) { return (d != static_cast<boost::uint32_t>(cpp_dec_float::cpp_dec_float_elem_mask - 1)); }
608    static bool char_is_nonzero_predicate(const char& c) { return (c != static_cast<char>('0')); }
609
610    void from_unsigned_long_long(const boost::ulong_long_type u);
611
612    int cmp_data(const array_type& vd) const;
613
614    static boost::uint32_t mul_loop_uv(boost::uint32_t* const u, const boost::uint32_t* const v, const boost::int32_t p);
615    static boost::uint32_t mul_loop_n(boost::uint32_t* const u, boost::uint32_t n, const boost::int32_t p);
616    static boost::uint32_t div_loop_n(boost::uint32_t* const u, boost::uint32_t n, const boost::int32_t p);
617
618    bool rd_string(const char* const s);
619
620    template <unsigned D, class ET, class A>
621    friend class cpp_dec_float;
622 };
623
624 template <unsigned Digits10, class ExponentType, class Allocator>
625 typename cpp_dec_float<Digits10, ExponentType, Allocator>::initializer cpp_dec_float<Digits10, ExponentType, Allocator>::init;
626
627 template <unsigned Digits10, class ExponentType, class Allocator>
628 const boost::int32_t cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_radix;
629 template <unsigned Digits10, class ExponentType, class Allocator>
630 const boost::int32_t cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_digits10_setting;
631 template <unsigned Digits10, class ExponentType, class Allocator>
632 const boost::int32_t cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_digits10_limit_lo;
633 template <unsigned Digits10, class ExponentType, class Allocator>
634 const boost::int32_t cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_digits10_limit_hi;
635 template <unsigned Digits10, class ExponentType, class Allocator>
636 const boost::int32_t cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_digits10;
637 template <unsigned Digits10, class ExponentType, class Allocator>
638 const ExponentType cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_max_exp;
639 template <unsigned Digits10, class ExponentType, class Allocator>
640 const ExponentType cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_min_exp;
641 template <unsigned Digits10, class ExponentType, class Allocator>
642 const ExponentType cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_max_exp10;
643 template <unsigned Digits10, class ExponentType, class Allocator>
644 const ExponentType cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_min_exp10;
645 template <unsigned Digits10, class ExponentType, class Allocator>
646 const boost::int32_t cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_elem_digits10;
647 template <unsigned Digits10, class ExponentType, class Allocator>
648 const boost::int32_t cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_elem_number_request;
649 template <unsigned Digits10, class ExponentType, class Allocator>
650 const boost::int32_t cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_elem_number;
651 template <unsigned Digits10, class ExponentType, class Allocator>
652 const boost::int32_t cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_elem_mask;
653
654 template <unsigned Digits10, class ExponentType, class Allocator>
655 cpp_dec_float<Digits10, ExponentType, Allocator>& cpp_dec_float<Digits10, ExponentType, Allocator>::operator+=(const cpp_dec_float<Digits10, ExponentType, Allocator>& v)
656 {
657    if ((isnan)())
658    {
659       return *this;
660    }
661
662    if ((isinf)())
663    {
664       if ((v.isinf)() && (isneg() != v.isneg()))
665       {
666          *this = nan();
667       }
668       return *this;
669    }
670
671    if (iszero())
672    {
673       return operator=(v);
674    }
675
676    if ((v.isnan)() || (v.isinf)())
677    {
678       *this = v;
679       return *this;
680    }
681
682    // Get the offset for the add/sub operation.
683    static const ExponentType max_delta_exp = static_cast<ExponentType>((cpp_dec_float_elem_number - 1) * cpp_dec_float_elem_digits10);
684
685    const ExponentType ofs_exp = static_cast<ExponentType>(exp - v.exp);
686
687    // Check if the operation is out of range, requiring special handling.
688    if (v.iszero() || (ofs_exp > max_delta_exp))
689    {
690       // Result is *this unchanged since v is negligible compared to *this.
691       return *this;
692    }
693    else if (ofs_exp < -max_delta_exp)
694    {
695       // Result is *this = v since *this is negligible compared to v.
696       return operator=(v);
697    }
698
699    // Do the add/sub operation.
700
701    typename array_type::iterator       p_u    = data.begin();
702    typename array_type::const_iterator p_v    = v.data.begin();
703    bool                                b_copy = false;
704    const boost::int32_t                ofs    = static_cast<boost::int32_t>(static_cast<boost::int32_t>(ofs_exp) / cpp_dec_float_elem_digits10);
705    array_type                          n_data;
706
707    if (neg == v.neg)
708    {
709       // Add v to *this, where the data array of either *this or v
710       // might have to be treated with a positive, negative or zero offset.
711       // The result is stored in *this. The data are added one element
712       // at a time, each element with carry.
713       if (ofs >= static_cast<boost::int32_t>(0))
714       {
715          std::copy(v.data.begin(), v.data.end() - static_cast<size_t>(ofs), n_data.begin() + static_cast<size_t>(ofs));
716          std::fill(n_data.begin(), n_data.begin() + static_cast<size_t>(ofs), static_cast<boost::uint32_t>(0u));
717          p_v = n_data.begin();
718       }
719       else
720       {
721          std::copy(data.begin(), data.end() - static_cast<size_t>(-ofs), n_data.begin() + static_cast<size_t>(-ofs));
722          std::fill(n_data.begin(), n_data.begin() + static_cast<size_t>(-ofs), static_cast<boost::uint32_t>(0u));
723          p_u    = n_data.begin();
724          b_copy = true;
725       }
726
727       // Addition algorithm
728       boost::uint32_t carry = static_cast<boost::uint32_t>(0u);
729
730       for (boost::int32_t j = static_cast<boost::int32_t>(cpp_dec_float_elem_number - static_cast<boost::int32_t>(1)); j >= static_cast<boost::int32_t>(0); j--)
731       {
732          boost::uint32_t t = static_cast<boost::uint32_t>(static_cast<boost::uint32_t>(p_u[j] + p_v[j]) + carry);
733          carry             = t / static_cast<boost::uint32_t>(cpp_dec_float_elem_mask);
734          p_u[j]            = static_cast<boost::uint32_t>(t - static_cast<boost::uint32_t>(carry * static_cast<boost::uint32_t>(cpp_dec_float_elem_mask)));
735       }
736
737       if (b_copy)
738       {
739          data = n_data;
740          exp  = v.exp;
741       }
742
743       // There needs to be a carry into the element -1 of the array data
744       if (carry != static_cast<boost::uint32_t>(0u))
745       {
746          std::copy_backward(data.begin(), data.end() - static_cast<std::size_t>(1u), data.end());
747          data[0] = carry;
748          exp += static_cast<ExponentType>(cpp_dec_float_elem_digits10);
749       }
750    }
751    else
752    {
753       // Subtract v from *this, where the data array of either *this or v
754       // might have to be treated with a positive, negative or zero offset.
755       if ((ofs > static_cast<boost::int32_t>(0)) || ((ofs == static_cast<boost::int32_t>(0)) && (cmp_data(v.data) > static_cast<boost::int32_t>(0))))
756       {
757          // In this case, |u| > |v| and ofs is positive.
758          // Copy the data of v, shifted down to a lower value
759          // into the data array m_n. Set the operand pointer p_v
760          // to point to the copied, shifted data m_n.
761          std::copy(v.data.begin(), v.data.end() - static_cast<size_t>(ofs), n_data.begin() + static_cast<size_t>(ofs));
762          std::fill(n_data.begin(), n_data.begin() + static_cast<size_t>(ofs), static_cast<boost::uint32_t>(0u));
763          p_v = n_data.begin();
764       }
765       else
766       {
767          if (ofs != static_cast<boost::int32_t>(0))
768          {
769             // In this case, |u| < |v| and ofs is negative.
770             // Shift the data of u down to a lower value.
771             std::copy_backward(data.begin(), data.end() - static_cast<size_t>(-ofs), data.end());
772             std::fill(data.begin(), data.begin() + static_cast<size_t>(-ofs), static_cast<boost::uint32_t>(0u));
773          }
774
775          // Copy the data of v into the data array n_data.
776          // Set the u-pointer p_u to point to m_n and the
777          // operand pointer p_v to point to the shifted
778          // data m_data.
779          n_data = v.data;
780          p_u    = n_data.begin();
781          p_v    = data.begin();
782          b_copy = true;
783       }
784
785       boost::int32_t j;
786
787       // Subtraction algorithm
788       boost::int32_t borrow = static_cast<boost::int32_t>(0);
789
790       for (j = static_cast<boost::int32_t>(cpp_dec_float_elem_number - static_cast<boost::int32_t>(1)); j >= static_cast<boost::int32_t>(0); j--)
791       {
792          boost::int32_t t = static_cast<boost::int32_t>(static_cast<boost::int32_t>(static_cast<boost::int32_t>(p_u[j]) - static_cast<boost::int32_t>(p_v[j])) - borrow);
793
794          // Underflow? Borrow?
795          if (t < static_cast<boost::int32_t>(0))
796          {
797             // Yes, underflow and borrow
798             t += static_cast<boost::int32_t>(cpp_dec_float_elem_mask);
799             borrow = static_cast<boost::int32_t>(1);
800          }
801          else
802          {
803             borrow = static_cast<boost::int32_t>(0);
804          }
805
806          p_u[j] = static_cast<boost::uint32_t>(static_cast<boost::uint32_t>(t) % static_cast<boost::uint32_t>(cpp_dec_float_elem_mask));
807       }
808
809       if (b_copy)
810       {
811          data = n_data;
812          exp  = v.exp;
813          neg  = v.neg;
814       }
815
816       // Is it necessary to justify the data?
817       const typename array_type::const_iterator first_nonzero_elem = std::find_if(data.begin(), data.end(), data_elem_is_non_zero_predicate);
818
819       if (first_nonzero_elem != data.begin())
820       {
821          if (first_nonzero_elem == data.end())
822          {
823             // This result of the subtraction is exactly zero.
824             // Reset the sign and the exponent.
825             neg = false;
826             exp = static_cast<ExponentType>(0);
827          }
828          else
829          {
830             // Justify the data
831             const std::size_t sj = static_cast<std::size_t>(std::distance<typename array_type::const_iterator>(data.begin(), first_nonzero_elem));
832
833             std::copy(data.begin() + static_cast<std::size_t>(sj), data.end(), data.begin());
834             std::fill(data.end() - sj, data.end(), static_cast<boost::uint32_t>(0u));
835
836             exp -= static_cast<ExponentType>(sj * static_cast<std::size_t>(cpp_dec_float_elem_digits10));
837          }
838       }
839    }
840
841    // Handle underflow.
842    if (iszero())
843       return (*this = zero());
844
845    // Check for potential overflow.
846    const bool b_result_might_overflow = (exp >= static_cast<ExponentType>(cpp_dec_float_max_exp10));
847
848    // Handle overflow.
849    if (b_result_might_overflow)
850    {
851       const bool b_result_is_neg = neg;
852       neg                        = false;
853
854       if (compare((cpp_dec_float::max)()) > 0)
855          *this = inf();
856
857       neg = b_result_is_neg;
858    }
859
860    return *this;
861 }
862
863 template <unsigned Digits10, class ExponentType, class Allocator>
864 cpp_dec_float<Digits10, ExponentType, Allocator>& cpp_dec_float<Digits10, ExponentType, Allocator>::operator-=(const cpp_dec_float<Digits10, ExponentType, Allocator>& v)
865 {
866    // Use *this - v = -(-*this + v).
867    negate();
868    *this += v;
869    negate();
870    return *this;
871 }
872
873 template <unsigned Digits10, class ExponentType, class Allocator>
874 cpp_dec_float<Digits10, ExponentType, Allocator>& cpp_dec_float<Digits10, ExponentType, Allocator>::operator*=(const cpp_dec_float<Digits10, ExponentType, Allocator>& v)
875 {
876    // Evaluate the sign of the result.
877    const bool b_result_is_neg = (neg != v.neg);
878
879    // Artificially set the sign of the result to be positive.
880    neg = false;
881
882    // Handle special cases like zero, inf and NaN.
883    const bool b_u_is_inf  = (isinf)();
884    const bool b_v_is_inf  = (v.isinf)();
885    const bool b_u_is_zero = iszero();
886    const bool b_v_is_zero = v.iszero();
887
888    if (((isnan)() || (v.isnan)()) || (b_u_is_inf && b_v_is_zero) || (b_v_is_inf && b_u_is_zero))
889    {
890       *this = nan();
891       return *this;
892    }
893
894    if (b_u_is_inf || b_v_is_inf)
895    {
896       *this = inf();
897       if (b_result_is_neg)
898          negate();
899       return *this;
900    }
901
902    if (b_u_is_zero || b_v_is_zero)
903    {
904       return *this = zero();
905    }
906
907    // Check for potential overflow or underflow.
908    const bool b_result_might_overflow  = ((exp + v.exp) >= static_cast<ExponentType>(cpp_dec_float_max_exp10));
909    const bool b_result_might_underflow = ((exp + v.exp) <= static_cast<ExponentType>(cpp_dec_float_min_exp10));
910
911    // Set the exponent of the result.
912    exp += v.exp;
913
914    const boost::int32_t prec_mul = (std::min)(prec_elem, v.prec_elem);
915
916    const boost::uint32_t carry = mul_loop_uv(data.data(), v.data.data(), prec_mul);
917
918    // Handle a potential carry.
919    if (carry != static_cast<boost::uint32_t>(0u))
920    {
921       exp += cpp_dec_float_elem_digits10;
922
923       // Shift the result of the multiplication one element to the right...
924       std::copy_backward(data.begin(),
925                          data.begin() + static_cast<std::size_t>(prec_elem - static_cast<boost::int32_t>(1)),
926                          data.begin() + static_cast<std::size_t>(prec_elem));
927
928       // ... And insert the carry.
929       data.front() = carry;
930    }
931
932    // Handle overflow.
933    if (b_result_might_overflow && (compare((cpp_dec_float::max)()) > 0))
934    {
935       *this = inf();
936    }
937
938    // Handle underflow.
939    if (b_result_might_underflow && (compare((cpp_dec_float::min)()) < 0))
940    {
941       *this = zero();
942
943       return *this;
944    }
945
946    // Set the sign of the result.
947    neg = b_result_is_neg;
948
949    return *this;
950 }
951
952 template <unsigned Digits10, class ExponentType, class Allocator>
953 cpp_dec_float<Digits10, ExponentType, Allocator>& cpp_dec_float<Digits10, ExponentType, Allocator>::operator/=(const cpp_dec_float<Digits10, ExponentType, Allocator>& v)
954 {
955    if (iszero())
956    {
957       if ((v.isnan)())
958       {
959          return *this = v;
960       }
961       else if (v.iszero())
962       {
963          return *this = nan();
964       }
965    }
966
967    const bool u_and_v_are_finite_and_identical = ((isfinite)() && (fpclass == v.fpclass) && (exp == v.exp) && (cmp_data(v.data) == static_cast<boost::int32_t>(0)));
968
969    if (u_and_v_are_finite_and_identical)
970    {
971       if (neg != v.neg)
972       {
973          *this = one();
974          negate();
975       }
976       else
977          *this = one();
978       return *this;
979    }
980    else
981    {
982       cpp_dec_float t(v);
983       t.calculate_inv();
984       return operator*=(t);
985    }
986 }
987
988 template <unsigned Digits10, class ExponentType, class Allocator>
989 cpp_dec_float<Digits10, ExponentType, Allocator>& cpp_dec_float<Digits10, ExponentType, Allocator>::mul_unsigned_long_long(const boost::ulong_long_type n)
990 {
991    // Multiply *this with a constant boost::ulong_long_type.
992
993    // Evaluate the sign of the result.
994    const bool b_neg = neg;
995
996    // Artificially set the sign of the result to be positive.
997    neg = false;
998
999    // Handle special cases like zero, inf and NaN.
1000    const bool b_u_is_inf  = (isinf)();
1001    const bool b_n_is_zero = (n == static_cast<boost::int32_t>(0));
1002
1003    if ((isnan)() || (b_u_is_inf && b_n_is_zero))
1004    {
1005       return (*this = nan());
1006    }
1007
1008    if (b_u_is_inf)
1009    {
1010       *this = inf();
1011       if (b_neg)
1012          negate();
1013       return *this;
1014    }
1015
1016    if (iszero() || b_n_is_zero)
1017    {
1018       // Multiplication by zero.
1019       return *this = zero();
1020    }
1021
1022    if (n >= static_cast<boost::ulong_long_type>(cpp_dec_float_elem_mask))
1023    {
1024       neg = b_neg;
1025       cpp_dec_float t;
1026       t = n;
1027       return operator*=(t);
1028    }
1029
1030    if (n == static_cast<boost::ulong_long_type>(1u))
1031    {
1032       neg = b_neg;
1033       return *this;
1034    }
1035
1036    // Set up the multiplication loop.
1037    const boost::uint32_t nn    = static_cast<boost::uint32_t>(n);
1038    const boost::uint32_t carry = mul_loop_n(data.data(), nn, prec_elem);
1039
1040    // Handle the carry and adjust the exponent.
1041    if (carry != static_cast<boost::uint32_t>(0u))
1042    {
1043       exp += static_cast<ExponentType>(cpp_dec_float_elem_digits10);
1044
1045       // Shift the result of the multiplication one element to the right.
1046       std::copy_backward(data.begin(),
1047                          data.begin() + static_cast<std::size_t>(prec_elem - static_cast<boost::int32_t>(1)),
1048                          data.begin() + static_cast<std::size_t>(prec_elem));
1049
1050       data.front() = static_cast<boost::uint32_t>(carry);
1051    }
1052
1053    // Check for potential overflow.
1054    const bool b_result_might_overflow = (exp >= cpp_dec_float_max_exp10);
1055
1056    // Handle overflow.
1057    if (b_result_might_overflow && (compare((cpp_dec_float::max)()) > 0))
1058    {
1059       *this = inf();
1060    }
1061
1062    // Set the sign.
1063    neg = b_neg;
1064
1065    return *this;
1066 }
1067
1068 template <unsigned Digits10, class ExponentType, class Allocator>
1069 cpp_dec_float<Digits10, ExponentType, Allocator>& cpp_dec_float<Digits10, ExponentType, Allocator>::div_unsigned_long_long(const boost::ulong_long_type n)
1070 {
1071    // Divide *this by a constant boost::ulong_long_type.
1072
1073    // Evaluate the sign of the result.
1074    const bool b_neg = neg;
1075
1076    // Artificially set the sign of the result to be positive.
1077    neg = false;
1078
1079    // Handle special cases like zero, inf and NaN.
1080    if ((isnan)())
1081    {
1082       return *this;
1083    }
1084
1085    if ((isinf)())
1086    {
1087       *this = inf();
1088       if (b_neg)
1089          negate();
1090       return *this;
1091    }
1092
1093    if (n == static_cast<boost::ulong_long_type>(0u))
1094    {
1095       // Divide by 0.
1096       if (iszero())
1097       {
1098          *this = nan();
1099          return *this;
1100       }
1101       else
1102       {
1103          *this = inf();
1104          if (isneg())
1105             negate();
1106          return *this;
1107       }
1108    }
1109
1110    if (iszero())
1111    {
1112       return *this;
1113    }
1114
1115    if (n >= static_cast<boost::ulong_long_type>(cpp_dec_float_elem_mask))
1116    {
1117       neg = b_neg;
1118       cpp_dec_float t;
1119       t = n;
1120       return operator/=(t);
1121    }
1122
1123    const boost::uint32_t nn = static_cast<boost::uint32_t>(n);
1124
1125    if (nn > static_cast<boost::uint32_t>(1u))
1126    {
1127       // Do the division loop.
1128       const boost::uint32_t prev = div_loop_n(data.data(), nn, prec_elem);
1129
1130       // Determine if one leading zero is in the result data.
1131       if (data[0] == static_cast<boost::uint32_t>(0u))
1132       {
1133          // Adjust the exponent
1134          exp -= static_cast<ExponentType>(cpp_dec_float_elem_digits10);
1135
1136          // Shift result of the division one element to the left.
1137          std::copy(data.begin() + static_cast<std::size_t>(1u),
1138                    data.begin() + static_cast<std::size_t>(prec_elem - static_cast<boost::int32_t>(1)),
1139                    data.begin());
1140
1141          data[prec_elem - static_cast<boost::int32_t>(1)] = static_cast<boost::uint32_t>(static_cast<boost::uint64_t>(prev * static_cast<boost::uint64_t>(cpp_dec_float_elem_mask)) / nn);
1142       }
1143    }
1144
1145    // Check for potential underflow.
1146    const bool b_result_might_underflow = (exp <= cpp_dec_float_min_exp10);
1147
1148    // Handle underflow.
1149    if (b_result_might_underflow && (compare((cpp_dec_float::min)()) < 0))
1150       return (*this = zero());
1151
1152    // Set the sign of the result.
1153    neg = b_neg;
1154
1155    return *this;
1156 }
1157
1158 template <unsigned Digits10, class ExponentType, class Allocator>
1159 cpp_dec_float<Digits10, ExponentType, Allocator>& cpp_dec_float<Digits10, ExponentType, Allocator>::calculate_inv()
1160 {
1161    // Compute the inverse of *this.
1162    const bool b_neg = neg;
1163
1164    neg = false;
1165
1166    // Handle special cases like zero, inf and NaN.
1167    if (iszero())
1168    {
1169       *this = inf();
1170       if (b_neg)
1171          negate();
1172       return *this;
1173    }
1174
1175    if ((isnan)())
1176    {
1177       return *this;
1178    }
1179
1180    if ((isinf)())
1181    {
1182       return *this = zero();
1183    }
1184
1185    if (isone())
1186    {
1187       if (b_neg)
1188          negate();
1189       return *this;
1190    }
1191
1192    // Save the original *this.
1193    cpp_dec_float<Digits10, ExponentType, Allocator> x(*this);
1194
1195    // Generate the initial estimate using division.
1196    // Extract the mantissa and exponent for a "manual"
1197    // computation of the estimate.
1198    double       dd;
1199    ExponentType ne;
1200    x.extract_parts(dd, ne);
1201
1202    // Do the inverse estimate using double precision estimates of mantissa and exponent.
1203    operator=(cpp_dec_float<Digits10, ExponentType, Allocator>(1.0 / dd, -ne));
1204
1205    // Compute the inverse of *this. Quadratically convergent Newton-Raphson iteration
1206    // is used. During the iterative steps, the precision of the calculation is limited
1207    // to the minimum required in order to minimize the run-time.
1208
1209    static const boost::int32_t double_digits10_minus_a_few = std::numeric_limits<double>::digits10 - 3;
1210
1211    for (boost::int32_t digits = double_digits10_minus_a_few; digits <= cpp_dec_float_total_digits10; digits *= static_cast<boost::int32_t>(2))
1212    {
1213       // Adjust precision of the terms.
1214       precision(static_cast<boost::int32_t>((digits + 10) * static_cast<boost::int32_t>(2)));
1215       x.precision(static_cast<boost::int32_t>((digits + 10) * static_cast<boost::int32_t>(2)));
1216
1217       // Next iteration.
1218       cpp_dec_float t(*this);
1219       t *= x;
1220       t -= two();
1221       t.negate();
1222       *this *= t;
1223    }
1224
1225    neg = b_neg;
1226
1227    prec_elem = cpp_dec_float_elem_number;
1228
1229    return *this;
1230 }
1231
1232 template <unsigned Digits10, class ExponentType, class Allocator>
1233 cpp_dec_float<Digits10, ExponentType, Allocator>& cpp_dec_float<Digits10, ExponentType, Allocator>::calculate_sqrt()
1234 {
1235    // Compute the square root of *this.
1236
1237    if ((isinf)() && !isneg())
1238    {
1239       return *this;
1240    }
1241
1242    if (isneg() || (!(isfinite)()))
1243    {
1244       *this = nan();
1245       errno = EDOM;
1246       return *this;
1247    }
1248
1249    if (iszero() || isone())
1250    {
1251       return *this;
1252    }
1253
1254    // Save the original *this.
1255    cpp_dec_float<Digits10, ExponentType, Allocator> x(*this);
1256
1257    // Generate the initial estimate using division.
1258    // Extract the mantissa and exponent for a "manual"
1259    // computation of the estimate.
1260    double       dd;
1261    ExponentType ne;
1262    extract_parts(dd, ne);
1263
1264    // Force the exponent to be an even multiple of two.
1265    if ((ne % static_cast<ExponentType>(2)) != static_cast<ExponentType>(0))
1266    {
1267       ++ne;
1268       dd /= 10.0;
1269    }
1270
1271    // Setup the iteration.
1272    // Estimate the square root using simple manipulations.
1273    const double sqd = std::sqrt(dd);
1274
1275    *this = cpp_dec_float<Digits10, ExponentType, Allocator>(sqd, static_cast<ExponentType>(ne / static_cast<ExponentType>(2)));
1276
1277    // Estimate 1.0 / (2.0 * x0) using simple manipulations.
1278    cpp_dec_float<Digits10, ExponentType, Allocator> vi(0.5 / sqd, static_cast<ExponentType>(-ne / static_cast<ExponentType>(2)));
1279
1280    // Compute the square root of x. Coupled Newton iteration
1281    // as described in "Pi Unleashed" is used. During the
1282    // iterative steps, the precision of the calculation is
1283    // limited to the minimum required in order to minimize
1284    // the run-time.
1285    //
1286    // Book references:
1287    // https://doi.org/10.1007/978-3-642-56735-3
1288    // http://www.amazon.com/exec/obidos/tg/detail/-/3540665722/qid=1035535482/sr=8-7/ref=sr_8_7/104-3357872-6059916?v=glance&n=507846
1289
1290    static const boost::uint32_t double_digits10_minus_a_few = std::numeric_limits<double>::digits10 - 3;
1291
1292    for (boost::int32_t digits = double_digits10_minus_a_few; digits <= cpp_dec_float_total_digits10; digits *= 2u)
1293    {
1294       // Adjust precision of the terms.
1295       precision((digits + 10) * 2);
1296       vi.precision((digits + 10) * 2);
1297
1298       // Next iteration of vi
1299       cpp_dec_float t(*this);
1300       t *= vi;
1301       t.negate();
1302       t.mul_unsigned_long_long(2u);
1303       t += one();
1304       t *= vi;
1305       vi += t;
1306
1307       // Next iteration of *this
1308       t = *this;
1309       t *= *this;
1310       t.negate();
1311       t += x;
1312       t *= vi;
1313       *this += t;
1314    }
1315
1316    prec_elem = cpp_dec_float_elem_number;
1317
1318    return *this;
1319 }
1320
1321 template <unsigned Digits10, class ExponentType, class Allocator>
1322 int cpp_dec_float<Digits10, ExponentType, Allocator>::cmp_data(const array_type& vd) const
1323 {
1324    // Compare the data of *this with those of v.
1325    // Return +1 for *this > v
1326    // 0 for *this = v
1327    // -1 for *this < v
1328
1329    const std::pair<typename array_type::const_iterator, typename array_type::const_iterator> mismatch_pair = std::mismatch(data.begin(), data.end(), vd.begin());
1330
1331    const bool is_equal = ((mismatch_pair.first == data.end()) && (mismatch_pair.second == vd.end()));
1332
1333    if (is_equal)
1334    {
1335       return 0;
1336    }
1337    else
1338    {
1339       return ((*mismatch_pair.first > *mismatch_pair.second) ? 1 : -1);
1340    }
1341 }
1342
1343 template <unsigned Digits10, class ExponentType, class Allocator>
1344 int cpp_dec_float<Digits10, ExponentType, Allocator>::compare(const cpp_dec_float& v) const
1345 {
1346    // Compare v with *this.
1347    // Return +1 for *this > v
1348    // 0 for *this = v
1349    // -1 for *this < v
1350
1351    // Handle all non-finite cases.
1352    if ((!(isfinite)()) || (!(v.isfinite)()))
1353    {
1354       // NaN can never equal NaN. Return an implementation-dependent
1355       // signed result. Also note that comparison of NaN with NaN
1356       // using operators greater-than or less-than is undefined.
1357       if ((isnan)() || (v.isnan)())
1358       {
1359          return ((isnan)() ? 1 : -1);
1360       }
1361
1362       if ((isinf)() && (v.isinf)())
1363       {
1364          // Both *this and v are infinite. They are equal if they have the same sign.
1365          // Otherwise, *this is less than v if and only if *this is negative.
1366          return ((neg == v.neg) ? 0 : (neg ? -1 : 1));
1367       }
1368
1369       if ((isinf)())
1370       {
1371          // *this is infinite, but v is finite.
1372          // So negative infinite *this is less than any finite v.
1373          // Whereas positive infinite *this is greater than any finite v.
1374          return (isneg() ? -1 : 1);
1375       }
1376       else
1377       {
1378          // *this is finite, and v is infinite.
1379          // So any finite *this is greater than negative infinite v.
1380          // Whereas any finite *this is less than positive infinite v.
1381          return (v.neg ? 1 : -1);
1382       }
1383    }
1384
1385    // And now handle all *finite* cases.
1386    if (iszero())
1387    {
1388       // The value of *this is zero and v is either zero or non-zero.
1389       return (v.iszero() ? 0
1390                          : (v.neg ? 1 : -1));
1391    }
1392    else if (v.iszero())
1393    {
1394       // The value of v is zero and *this is non-zero.
1395       return (neg ? -1 : 1);
1396    }
1397    else
1398    {
1399       // Both *this and v are non-zero.
1400
1401       if (neg != v.neg)
1402       {
1403          // The signs are different.
1404          return (neg ? -1 : 1);
1405       }
1406       else if (exp != v.exp)
1407       {
1408          // The signs are the same and the exponents are different.
1409          const int val_cexpression = ((exp < v.exp) ? 1 : -1);
1410
1411          return (neg ? val_cexpression : -val_cexpression);
1412       }
1413       else
1414       {
1415          // The signs are the same and the exponents are the same.
1416          // Compare the data.
1417          const int val_cmp_data = cmp_data(v.data);
1418
1419          return ((!neg) ? val_cmp_data : -val_cmp_data);
1420       }
1421    }
1422 }
1423
1424 template <unsigned Digits10, class ExponentType, class Allocator>
1425 bool cpp_dec_float<Digits10, ExponentType, Allocator>::isone() const
1426 {
1427    // Check if the value of *this is identically 1 or very close to 1.
1428
1429    const bool not_negative_and_is_finite = ((!neg) && (isfinite)());
1430
1431    if (not_negative_and_is_finite)
1432    {
1433       if ((data[0u] == static_cast<boost::uint32_t>(1u)) && (exp == static_cast<ExponentType>(0)))
1434       {
1435          const typename array_type::const_iterator it_non_zero = std::find_if(data.begin(), data.end(), data_elem_is_non_zero_predicate);
1436          return (it_non_zero == data.end());
1437       }
1438       else if ((data[0u] == static_cast<boost::uint32_t>(cpp_dec_float_elem_mask - 1)) && (exp == static_cast<ExponentType>(-cpp_dec_float_elem_digits10)))
1439       {
1440          const typename array_type::const_iterator it_non_nine = std::find_if(data.begin(), data.end(), data_elem_is_non_nine_predicate);
1441          return (it_non_nine == data.end());
1442       }
1443    }
1444
1445    return false;
1446 }
1447
1448 template <unsigned Digits10, class ExponentType, class Allocator>
1449 bool cpp_dec_float<Digits10, ExponentType, Allocator>::isint() const
1450 {
1451    if (fpclass != cpp_dec_float_finite)
1452    {
1453       return false;
1454    }
1455
1456    if (iszero())
1457    {
1458       return true;
1459    }
1460
1461    if (exp < static_cast<ExponentType>(0))
1462    {
1463       return false;
1464    } // |*this| < 1.
1465
1466    const typename array_type::size_type offset_decimal_part = static_cast<typename array_type::size_type>(exp / cpp_dec_float_elem_digits10) + 1u;
1467
1468    if (offset_decimal_part >= static_cast<typename array_type::size_type>(cpp_dec_float_elem_number))
1469    {
1470       // The number is too large to resolve the integer part.
1471       // It considered to be a pure integer.
1472       return true;
1473    }
1474
1475    typename array_type::const_iterator it_non_zero = std::find_if(data.begin() + offset_decimal_part, data.end(), data_elem_is_non_zero_predicate);
1476
1477    return (it_non_zero == data.end());
1478 }
1479
1480 template <unsigned Digits10, class ExponentType, class Allocator>
1481 void cpp_dec_float<Digits10, ExponentType, Allocator>::extract_parts(double& mantissa, ExponentType& exponent) const
1482 {
1483    // Extract the approximate parts mantissa and base-10 exponent from the input cpp_dec_float<Digits10, ExponentType, Allocator> value x.
1484
1485    // Extracts the mantissa and exponent.
1486    exponent = exp;
1487
1488    boost::uint32_t p10  = static_cast<boost::uint32_t>(1u);
1489    boost::uint32_t test = data[0u];
1490
1491    for (;;)
1492    {
1493       test /= static_cast<boost::uint32_t>(10u);
1494
1495       if (test == static_cast<boost::uint32_t>(0u))
1496       {
1497          break;
1498       }
1499
1500       p10 *= static_cast<boost::uint32_t>(10u);
1501       ++exponent;
1502    }
1503
1504    // Establish the upper bound of limbs for extracting the double.
1505    const int max_elem_in_double_count = static_cast<int>(static_cast<boost::int32_t>(std::numeric_limits<double>::digits10) / cpp_dec_float_elem_digits10) + (static_cast<int>(static_cast<boost::int32_t>(std::numeric_limits<double>::digits10) % cpp_dec_float_elem_digits10) != 0 ? 1 : 0) + 1;
1506
1507    // And make sure this upper bound stays within bounds of the elems.
1508    const std::size_t max_elem_extract_count = static_cast<std::size_t>((std::min)(static_cast<boost::int32_t>(max_elem_in_double_count), cpp_dec_float_elem_number));
1509
1510    // Extract into the mantissa the first limb, extracted as a double.
1511    mantissa     = static_cast<double>(data[0]);
1512    double scale = 1.0;
1513
1514    // Extract the rest of the mantissa piecewise from the limbs.
1515    for (std::size_t i = 1u; i < max_elem_extract_count; i++)
1516    {
1517       scale /= static_cast<double>(cpp_dec_float_elem_mask);
1518       mantissa += (static_cast<double>(data[i]) * scale);
1519    }
1520
1521    mantissa /= static_cast<double>(p10);
1522
1523    if (neg)
1524    {
1525       mantissa = -mantissa;
1526    }
1527 }
1528
1529 template <unsigned Digits10, class ExponentType, class Allocator>
1530 double cpp_dec_float<Digits10, ExponentType, Allocator>::extract_double() const
1531 {
1532    // Returns the double conversion of a cpp_dec_float<Digits10, ExponentType, Allocator>.
1533
1534    // Check for non-normal cpp_dec_float<Digits10, ExponentType, Allocator>.
1535    if (!(isfinite)())
1536    {
1537       if ((isnan)())
1538       {
1539          return std::numeric_limits<double>::quiet_NaN();
1540       }
1541       else
1542       {
1543          return ((!neg) ? std::numeric_limits<double>::infinity()
1544                         : -std::numeric_limits<double>::infinity());
1545       }
1546    }
1547
1548    cpp_dec_float<Digits10, ExponentType, Allocator> xx(*this);
1549    if (xx.isneg())
1550       xx.negate();
1551
1552    // Check if *this cpp_dec_float<Digits10, ExponentType, Allocator> is zero.
1553    if (iszero() || (xx.compare(double_min()) < 0))
1554    {
1555       return 0.0;
1556    }
1557
1558    // Check if *this cpp_dec_float<Digits10, ExponentType, Allocator> exceeds the maximum of double.
1559    if (xx.compare(double_max()) > 0)
1560    {
1561       return ((!neg) ? std::numeric_limits<double>::infinity()
1562                      : -std::numeric_limits<double>::infinity());
1563    }
1564
1565    std::stringstream ss;
1566
1567    ss << str(std::numeric_limits<double>::digits10 + (2 + 1), std::ios_base::scientific);
1568
1569    double d;
1570    ss >> d;
1571
1572    return d;
1573 }
1574
1575 template <unsigned Digits10, class ExponentType, class Allocator>
1576 long double cpp_dec_float<Digits10, ExponentType, Allocator>::extract_long_double() const
1577 {
1578    // Returns the long double conversion of a cpp_dec_float<Digits10, ExponentType, Allocator>.
1579
1580    // Check if *this cpp_dec_float<Digits10, ExponentType, Allocator> is subnormal.
1581    if (!(isfinite)())
1582    {
1583       if ((isnan)())
1584       {
1585          return std::numeric_limits<long double>::quiet_NaN();
1586       }
1587       else
1588       {
1589          return ((!neg) ? std::numeric_limits<long double>::infinity()
1590                         : -std::numeric_limits<long double>::infinity());
1591       }
1592    }
1593
1594    cpp_dec_float<Digits10, ExponentType, Allocator> xx(*this);
1595    if (xx.isneg())
1596       xx.negate();
1597
1598    // Check if *this cpp_dec_float<Digits10, ExponentType, Allocator> is zero.
1599    if (iszero() || (xx.compare(long_double_min()) < 0))
1600    {
1601       return static_cast<long double>(0.0);
1602    }
1603
1604    // Check if *this cpp_dec_float<Digits10, ExponentType, Allocator> exceeds the maximum of double.
1605    if (xx.compare(long_double_max()) > 0)
1606    {
1607       return ((!neg) ? std::numeric_limits<long double>::infinity()
1608                      : -std::numeric_limits<long double>::infinity());
1609    }
1610
1611    std::stringstream ss;
1612
1613    ss << str(std::numeric_limits<long double>::digits10 + (2 + 1), std::ios_base::scientific);
1614
1615    long double ld;
1616    ss >> ld;
1617
1618    return ld;
1619 }
1620
1621 template <unsigned Digits10, class ExponentType, class Allocator>
1622 boost::long_long_type cpp_dec_float<Digits10, ExponentType, Allocator>::extract_signed_long_long() const
1623 {
1624    // Extracts a signed long long from *this.
1625    // If (x > maximum of long long) or (x < minimum of long long),
1626    // then the maximum or minimum of long long is returned accordingly.
1627
1628    if (exp < static_cast<ExponentType>(0))
1629    {
1630       return static_cast<boost::long_long_type>(0);
1631    }
1632
1633    const bool b_neg = isneg();
1634
1635    boost::ulong_long_type val;
1636
1637    if ((!b_neg) && (compare(long_long_max()) > 0))
1638    {
1639       return (std::numeric_limits<boost::long_long_type>::max)();
1640    }
1641    else if (b_neg && (compare(long_long_min()) < 0))
1642    {
1643       return (std::numeric_limits<boost::long_long_type>::min)();
1644    }
1645    else
1646    {
1647       // Extract the data into an boost::ulong_long_type value.
1648       cpp_dec_float<Digits10, ExponentType, Allocator> xn(extract_integer_part());
1649       if (xn.isneg())
1650          xn.negate();
1651
1652       val = static_cast<boost::ulong_long_type>(xn.data[0]);
1653
1654       const boost::int32_t imax = (std::min)(static_cast<boost::int32_t>(static_cast<boost::int32_t>(xn.exp) / cpp_dec_float_elem_digits10), static_cast<boost::int32_t>(cpp_dec_float_elem_number - static_cast<boost::int32_t>(1)));
1655
1656       for (boost::int32_t i = static_cast<boost::int32_t>(1); i <= imax; i++)
1657       {
1658          val *= static_cast<boost::ulong_long_type>(cpp_dec_float_elem_mask);
1659          val += static_cast<boost::ulong_long_type>(xn.data[i]);
1660       }
1661    }
1662
1663    if (!b_neg)
1664    {
1665       return static_cast<boost::long_long_type>(val);
1666    }
1667    else
1668    {
1669       // This strange expression avoids a hardware trap in the corner case
1670       // that val is the most negative value permitted in boost::long_long_type.
1671       // See https://svn.boost.org/trac/boost/ticket/9740.
1672       //
1673       boost::long_long_type sval = static_cast<boost::long_long_type>(val - 1);
1674       sval                       = -sval;
1675       --sval;
1676       return sval;
1677    }
1678 }
1679
1680 template <unsigned Digits10, class ExponentType, class Allocator>
1681 boost::ulong_long_type cpp_dec_float<Digits10, ExponentType, Allocator>::extract_unsigned_long_long() const
1682 {
1683    // Extracts an boost::ulong_long_type from *this.
1684    // If x exceeds the maximum of boost::ulong_long_type,
1685    // then the maximum of boost::ulong_long_type is returned.
1686    // If x is negative, then the boost::ulong_long_type cast of
1687    // the long long extracted value is returned.
1688
1689    if (isneg())
1690    {
1691       return static_cast<boost::ulong_long_type>(extract_signed_long_long());
1692    }
1693
1694    if (exp < static_cast<ExponentType>(0))
1695    {
1696       return static_cast<boost::ulong_long_type>(0u);
1697    }
1698
1699    const cpp_dec_float<Digits10, ExponentType, Allocator> xn(extract_integer_part());
1700
1701    boost::ulong_long_type val;
1702
1703    if (xn.compare(ulong_long_max()) > 0)
1704    {
1705       return (std::numeric_limits<boost::ulong_long_type>::max)();
1706    }
1707    else
1708    {
1709       // Extract the data into an boost::ulong_long_type value.
1710       val = static_cast<boost::ulong_long_type>(xn.data[0]);
1711
1712       const boost::int32_t imax = (std::min)(static_cast<boost::int32_t>(static_cast<boost::int32_t>(xn.exp) / cpp_dec_float_elem_digits10), static_cast<boost::int32_t>(cpp_dec_float_elem_number - static_cast<boost::int32_t>(1)));
1713
1714       for (boost::int32_t i = static_cast<boost::int32_t>(1); i <= imax; i++)
1715       {
1716          val *= static_cast<boost::ulong_long_type>(cpp_dec_float_elem_mask);
1717          val += static_cast<boost::ulong_long_type>(xn.data[i]);
1718       }
1719    }
1720
1721    return val;
1722 }
1723
1724 template <unsigned Digits10, class ExponentType, class Allocator>
1725 cpp_dec_float<Digits10, ExponentType, Allocator> cpp_dec_float<Digits10, ExponentType, Allocator>::extract_integer_part() const
1726 {
1727    // Compute the signed integer part of x.
1728
1729    if (!(isfinite)())
1730    {
1731       return *this;
1732    }
1733
1734    if (exp < static_cast<ExponentType>(0))
1735    {
1736       // The absolute value of the number is smaller than 1.
1737       // Thus the integer part is zero.
1738       return zero();
1739    }
1740
1741    // Truncate the digits from the decimal part, including guard digits
1742    // that do not belong to the integer part.
1743
1744    // Make a local copy.
1745    cpp_dec_float<Digits10, ExponentType, Allocator> x = *this;
1746
1747    // Clear out the decimal portion
1748    const size_t first_clear = (static_cast<size_t>(x.exp) / static_cast<size_t>(cpp_dec_float_elem_digits10)) + 1u;
1749    const size_t last_clear  = static_cast<size_t>(cpp_dec_float_elem_number);
1750
1751    if (first_clear < last_clear)
1752       std::fill(x.data.begin() + first_clear, x.data.begin() + last_clear, static_cast<boost::uint32_t>(0u));
1753
1754    return x;
1755 }
1756
1757 template <unsigned Digits10, class ExponentType, class Allocator>
1758 std::string cpp_dec_float<Digits10, ExponentType, Allocator>::str(boost::intmax_t number_of_digits, std::ios_base::fmtflags f) const
1759 {
1760    if ((this->isinf)())
1761    {
1762       if (this->isneg())
1763          return "-inf";
1764       else if (f & std::ios_base::showpos)
1765          return "+inf";
1766       else
1767          return "inf";
1768    }
1769    else if ((this->isnan)())
1770    {
1771       return "nan";
1772    }
1773
1774    std::string     str;
1775    boost::intmax_t org_digits(number_of_digits);
1776    ExponentType    my_exp = order();
1777
1778    if (number_of_digits == 0)
1779       number_of_digits = cpp_dec_float_total_digits10;
1780
1781    if (f & std::ios_base::fixed)
1782    {
1783       number_of_digits += my_exp + 1;
1784    }
1785    else if (f & std::ios_base::scientific)
1786       ++number_of_digits;
1787    // Determine the number of elements needed to provide the requested digits from cpp_dec_float<Digits10, ExponentType, Allocator>.
1788    const std::size_t number_of_elements = (std::min)(static_cast<std::size_t>((number_of_digits / static_cast<std::size_t>(cpp_dec_float_elem_digits10)) + 2u),
1789                                                      static_cast<std::size_t>(cpp_dec_float_elem_number));
1790
1791    // Extract the remaining digits from cpp_dec_float<Digits10, ExponentType, Allocator> after the decimal point.
1792    str = boost::lexical_cast<std::string>(data[0]);
1793
1794    std::stringstream ss;
1795    // Extract all of the digits from cpp_dec_float<Digits10, ExponentType, Allocator>, beginning with the first data element.
1796    for (std::size_t i = static_cast<std::size_t>(1u); i < number_of_elements; i++)
1797    {
1798       ss << std::setw(static_cast<std::streamsize>(cpp_dec_float_elem_digits10))
1799          << std::setfill(static_cast<char>('0'))
1800          << data[i];
1801    }
1802    str += ss.str();
1803
1804    bool have_leading_zeros = false;
1805
1806    if (number_of_digits == 0)
1807    {
1808       // We only get here if the output format is "fixed" and we just need to
1809       // round the first non-zero digit.
1810       number_of_digits -= my_exp + 1; // reset to original value
1811       str.insert(static_cast<std::string::size_type>(0), std::string::size_type(number_of_digits), '0');
1812       have_leading_zeros = true;
1813    }
1814
1815    if (number_of_digits < 0)
1816    {
1817       str = "0";
1818       if (isneg())
1819          str.insert(static_cast<std::string::size_type>(0), 1, '-');
1820       boost::multiprecision::detail::format_float_string(str, 0, number_of_digits - my_exp - 1, f, this->iszero());
1821       return str;
1822    }
1823    else
1824    {
1825       // Cut the output to the size of the precision.
1826       if (str.length() > static_cast<std::string::size_type>(number_of_digits))
1827       {
1828          // Get the digit after the last needed digit for rounding
1829          const boost::uint32_t round = static_cast<boost::uint32_t>(static_cast<boost::uint32_t>(str[static_cast<std::string::size_type>(number_of_digits)]) - static_cast<boost::uint32_t>('0'));
1830
1831          bool need_round_up = round >= 5u;
1832
1833          if (round == 5u)
1834          {
1835             const boost::uint32_t ix = static_cast<boost::uint32_t>(static_cast<boost::uint32_t>(str[static_cast<std::string::size_type>(number_of_digits - 1)]) - static_cast<boost::uint32_t>('0'));
1836             if ((ix & 1u) == 0)
1837             {
1838                // We have an even digit followed by a 5, so we might not actually need to round up
1839                // if all the remaining digits are zero:
1840                if (str.find_first_not_of('0', static_cast<std::string::size_type>(number_of_digits + 1)) == std::string::npos)
1841                {
1842                   bool all_zeros = true;
1843                   // No none-zero trailing digits in the string, now check whatever parts we didn't convert to the string:
1844                   for (std::size_t i = number_of_elements; i < data.size(); i++)
1845                   {
1846                      if (data[i])
1847                      {
1848                         all_zeros = false;
1849                         break;
1850                      }
1851                   }
1852                   if (all_zeros)
1853                      need_round_up = false; // tie break - round to even.
1854                }
1855             }
1856          }
1857
1858          // Truncate the string
1859          str.erase(static_cast<std::string::size_type>(number_of_digits));
1860
1861          if (need_round_up)
1862          {
1863             std::size_t ix = static_cast<std::size_t>(str.length() - 1u);
1864
1865             // Every trailing 9 must be rounded up
1866             while (ix && (static_cast<boost::int32_t>(str.at(ix)) - static_cast<boost::int32_t>('0') == static_cast<boost::int32_t>(9)))
1867             {
1868                str.at(ix) = static_cast<char>('0');
1869                --ix;
1870             }
1871
1872             if (!ix)
1873             {
1874                // There were nothing but trailing nines.
1875                if (static_cast<boost::int32_t>(static_cast<boost::int32_t>(str.at(ix)) - static_cast<boost::int32_t>(0x30)) == static_cast<boost::int32_t>(9))
1876                {
1877                   // Increment up to the next order and adjust exponent.
1878                   str.at(ix) = static_cast<char>('1');
1879                   ++my_exp;
1880                }
1881                else
1882                {
1883                   // Round up this digit.
1884                   ++str.at(ix);
1885                }
1886             }
1887             else
1888             {
1889                // Round up the last digit.
1890                ++str[ix];
1891             }
1892          }
1893       }
1894    }
1895
1896    if (have_leading_zeros)
1897    {
1898       // We need to take the zeros back out again, and correct the exponent
1899       // if we rounded up:
1900       if (str[std::string::size_type(number_of_digits - 1)] != '0')
1901       {
1902          ++my_exp;
1903          str.erase(0, std::string::size_type(number_of_digits - 1));
1904       }
1905       else
1906          str.erase(0, std::string::size_type(number_of_digits));
1907    }
1908
1909    if (isneg())
1910       str.insert(static_cast<std::string::size_type>(0), 1, '-');
1911
1912    boost::multiprecision::detail::format_float_string(str, my_exp, org_digits, f, this->iszero());
1913    return str;
1914 }
1915
1916 template <unsigned Digits10, class ExponentType, class Allocator>
1917 bool cpp_dec_float<Digits10, ExponentType, Allocator>::rd_string(const char* const s)
1918 {
1919 #ifndef BOOST_NO_EXCEPTIONS
1920    try
1921    {
1922 #endif
1923
1924       std::string str(s);
1925
1926       // TBD: Using several regular expressions may significantly reduce
1927       // the code complexity (and perhaps the run-time) of rd_string().
1928
1929       // Get a possible exponent and remove it.
1930       exp = static_cast<ExponentType>(0);
1931
1932       std::size_t pos;
1933
1934       if (((pos = str.find('e')) != std::string::npos) || ((pos = str.find('E')) != std::string::npos))
1935       {
1936          // Remove the exponent part from the string.
1937          exp = boost::lexical_cast<ExponentType>(static_cast<const char*>(str.c_str() + (pos + 1u)));
1938          str = str.substr(static_cast<std::size_t>(0u), pos);
1939       }
1940
1941       // Get a possible +/- sign and remove it.
1942       neg = false;
1943
1944       if (str.size())
1945       {
1946          if (str[0] == '-')
1947          {
1948             neg = true;
1949             str.erase(0, 1);
1950          }
1951          else if (str[0] == '+')
1952          {
1953             str.erase(0, 1);
1954          }
1955       }
1956       //
1957       // Special cases for infinities and NaN's:
1958       //
1959       if ((str == "inf") || (str == "INF") || (str == "infinity") || (str == "INFINITY"))
1960       {
1961          if (neg)
1962          {
1963             *this = this->inf();
1964             this->negate();
1965          }
1966          else
1967             *this = this->inf();
1968          return true;
1969       }
1970       if ((str.size() >= 3) && ((str.substr(0, 3) == "nan") || (str.substr(0, 3) == "NAN") || (str.substr(0, 3) == "NaN")))
1971       {
1972          *this = this->nan();
1973          return true;
1974       }
1975
1976       // Remove the leading zeros for all input types.
1977       const std::string::iterator fwd_it_leading_zero = std::find_if(str.begin(), str.end(), char_is_nonzero_predicate);
1978
1979       if (fwd_it_leading_zero != str.begin())
1980       {
1981          if (fwd_it_leading_zero == str.end())
1982          {
1983             // The string contains nothing but leading zeros.
1984             // This string represents zero.
1985             operator=(zero());
1986             return true;
1987          }
1988          else
1989          {
1990             str.erase(str.begin(), fwd_it_leading_zero);
1991          }
1992       }
1993
1994       // Put the input string into the standard cpp_dec_float<Digits10, ExponentType, Allocator> input form
1995       // aaa.bbbbE+/-n, where aaa has 1...cpp_dec_float_elem_digits10, bbbb has an
1996       // even multiple of cpp_dec_float_elem_digits10 which are possibly zero padded
1997       // on the right-end, and n is a signed 64-bit integer which is an
1998       // even multiple of cpp_dec_float_elem_digits10.
1999
2000       // Find a possible decimal point.
2001       pos = str.find(static_cast<char>('.'));
2002
2003       if (pos != std::string::npos)
2004       {
2005          // Remove all trailing insignificant zeros.
2006          const std::string::const_reverse_iterator rit_non_zero = std::find_if(str.rbegin(), str.rend(), char_is_nonzero_predicate);
2007
2008          if (rit_non_zero != static_cast<std::string::const_reverse_iterator>(str.rbegin()))
2009          {
2010             const std::string::size_type ofs = str.length() - std::distance<std::string::const_reverse_iterator>(str.rbegin(), rit_non_zero);
2011             str.erase(str.begin() + ofs, str.end());
2012          }
2013
2014          // Check if the input is identically zero.
2015          if (str == std::string("."))
2016          {
2017             operator=(zero());
2018             return true;
2019          }
2020
2021          // Remove leading significant zeros just after the decimal point
2022          // and adjust the exponent accordingly.
2023          // Note that the while-loop operates only on strings of the form ".000abcd..."
2024          // and peels away the zeros just after the decimal point.
2025          if (str.at(static_cast<std::size_t>(0u)) == static_cast<char>('.'))
2026          {
2027             const std::string::iterator it_non_zero = std::find_if(str.begin() + 1u, str.end(), char_is_nonzero_predicate);
2028
2029             std::size_t delta_exp = static_cast<std::size_t>(0u);
2030
2031             if (str.at(static_cast<std::size_t>(1u)) == static_cast<char>('0'))
2032             {
2033                delta_exp = std::distance<std::string::const_iterator>(str.begin() + 1u, it_non_zero);
2034             }
2035
2036             // Bring one single digit into the mantissa and adjust the exponent accordingly.
2037             str.erase(str.begin(), it_non_zero);
2038             str.insert(static_cast<std::string::size_type>(1u), ".");
2039             exp -= static_cast<ExponentType>(delta_exp + 1u);
2040          }
2041       }
2042       else
2043       {
2044          // Input string has no decimal point: Append decimal point.
2045          str.append(".");
2046       }
2047
2048       // Shift the decimal point such that the exponent is an even multiple of cpp_dec_float_elem_digits10.
2049       std::size_t       n_shift   = static_cast<std::size_t>(0u);
2050       const std::size_t n_exp_rem = static_cast<std::size_t>(exp % static_cast<ExponentType>(cpp_dec_float_elem_digits10));
2051
2052       if ((exp % static_cast<ExponentType>(cpp_dec_float_elem_digits10)) != static_cast<ExponentType>(0))
2053       {
2054          n_shift = ((exp < static_cast<ExponentType>(0))
2055                         ? static_cast<std::size_t>(n_exp_rem + static_cast<std::size_t>(cpp_dec_float_elem_digits10))
2056                         : static_cast<std::size_t>(n_exp_rem));
2057       }
2058
2059       // Make sure that there are enough digits for the decimal point shift.
2060       pos = str.find(static_cast<char>('.'));
2061
2062       std::size_t pos_plus_one = static_cast<std::size_t>(pos + 1u);
2063
2064       if ((str.length() - pos_plus_one) < n_shift)
2065       {
2066          const std::size_t sz = static_cast<std::size_t>(n_shift - (str.length() - pos_plus_one));
2067
2068          str.append(std::string(sz, static_cast<char>('0')));
2069       }
2070
2071       // Do the decimal point shift.
2072       if (n_shift != static_cast<std::size_t>(0u))
2073       {
2074          str.insert(static_cast<std::string::size_type>(pos_plus_one + n_shift), ".");
2075
2076          str.erase(pos, static_cast<std::string::size_type>(1u));
2077
2078          exp -= static_cast<ExponentType>(n_shift);
2079       }
2080
2081       // Cut the size of the mantissa to <= cpp_dec_float_elem_digits10.
2082       pos          = str.find(static_cast<char>('.'));
2083       pos_plus_one = static_cast<std::size_t>(pos + 1u);
2084
2085       if (pos > static_cast<std::size_t>(cpp_dec_float_elem_digits10))
2086       {
2087          const boost::int32_t n_pos         = static_cast<boost::int32_t>(pos);
2088          const boost::int32_t n_rem_is_zero = ((static_cast<boost::int32_t>(n_pos % cpp_dec_float_elem_digits10) == static_cast<boost::int32_t>(0)) ? static_cast<boost::int32_t>(1) : static_cast<boost::int32_t>(0));
2089          const boost::int32_t n             = static_cast<boost::int32_t>(static_cast<boost::int32_t>(n_pos / cpp_dec_float_elem_digits10) - n_rem_is_zero);
2090
2091          str.insert(static_cast<std::size_t>(static_cast<boost::int32_t>(n_pos - static_cast<boost::int32_t>(n * cpp_dec_float_elem_digits10))), ".");
2092
2093          str.erase(pos_plus_one, static_cast<std::size_t>(1u));
2094
2095          exp += static_cast<ExponentType>(static_cast<ExponentType>(n) * static_cast<ExponentType>(cpp_dec_float_elem_digits10));
2096       }
2097
2098       // Pad the decimal part such that its value is an even
2099       // multiple of cpp_dec_float_elem_digits10.
2100       pos          = str.find(static_cast<char>('.'));
2101       pos_plus_one = static_cast<std::size_t>(pos + 1u);
2102
2103       const boost::int32_t n_dec = static_cast<boost::int32_t>(static_cast<boost::int32_t>(str.length() - 1u) - static_cast<boost::int32_t>(pos));
2104       const boost::int32_t n_rem = static_cast<boost::int32_t>(n_dec % cpp_dec_float_elem_digits10);
2105
2106       boost::int32_t n_cnt = ((n_rem != static_cast<boost::int32_t>(0))
2107                                   ? static_cast<boost::int32_t>(cpp_dec_float_elem_digits10 - n_rem)
2108                                   : static_cast<boost::int32_t>(0));
2109
2110       if (n_cnt != static_cast<boost::int32_t>(0))
2111       {
2112          str.append(static_cast<std::size_t>(n_cnt), static_cast<char>('0'));
2113       }
2114
2115       // Truncate decimal part if it is too long.
2116       const std::size_t max_dec = static_cast<std::size_t>((cpp_dec_float_elem_number - 1) * cpp_dec_float_elem_digits10);
2117
2118       if (static_cast<std::size_t>(str.length() - pos) > max_dec)
2119       {
2120          str = str.substr(static_cast<std::size_t>(0u),
2121                           static_cast<std::size_t>(pos_plus_one + max_dec));
2122       }
2123
2124       // Now the input string has the standard cpp_dec_float<Digits10, ExponentType, Allocator> input form.
2125       // (See the comment above.)
2126
2127       // Set all the data elements to 0.
2128       std::fill(data.begin(), data.end(), static_cast<boost::uint32_t>(0u));
2129
2130       // Extract the data.
2131
2132       // First get the digits to the left of the decimal point...
2133       data[0u] = boost::lexical_cast<boost::uint32_t>(str.substr(static_cast<std::size_t>(0u), pos));
2134
2135       // ...then get the remaining digits to the right of the decimal point.
2136       const std::string::size_type i_end = ((str.length() - pos_plus_one) / static_cast<std::string::size_type>(cpp_dec_float_elem_digits10));
2137
2138       for (std::string::size_type i = static_cast<std::string::size_type>(0u); i < i_end; i++)
2139       {
2140          const std::string::const_iterator it = str.begin() + pos_plus_one + (i * static_cast<std::string::size_type>(cpp_dec_float_elem_digits10));
2141
2142          data[i + 1u] = boost::lexical_cast<boost::uint32_t>(std::string(it, it + static_cast<std::string::size_type>(cpp_dec_float_elem_digits10)));
2143       }
2144
2145       // Check for overflow...
2146       if (exp > cpp_dec_float_max_exp10)
2147       {
2148          const bool b_result_is_neg = neg;
2149
2150          *this = inf();
2151          if (b_result_is_neg)
2152             negate();
2153       }
2154
2155       // ...and check for underflow.
2156       if (exp <= cpp_dec_float_min_exp10)
2157       {
2158          if (exp == cpp_dec_float_min_exp10)
2159          {
2160             // Check for identity with the minimum value.
2161             cpp_dec_float<Digits10, ExponentType, Allocator> test = *this;
2162
2163             test.exp = static_cast<ExponentType>(0);
2164
2165             if (test.isone())
2166             {
2167                *this = zero();
2168             }
2169          }
2170          else
2171          {
2172             *this = zero();
2173          }
2174       }
2175
2176 #ifndef BOOST_NO_EXCEPTIONS
2177    }
2178    catch (const bad_lexical_cast&)
2179    {
2180       // Rethrow with better error message:
2181       std::string msg = "Unable to parse the string \"";
2182       msg += s;
2183       msg += "\" as a floating point value.";
2184       throw std::runtime_error(msg);
2185    }
2186 #endif
2187    return true;
2188 }
2189
2190 template <unsigned Digits10, class ExponentType, class Allocator>
2191 cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float(const double mantissa, const ExponentType exponent)
2192     : data(),
2193       exp(static_cast<ExponentType>(0)),
2194       neg(false),
2195       fpclass(cpp_dec_float_finite),
2196       prec_elem(cpp_dec_float_elem_number)
2197 {
2198    // Create *this cpp_dec_float<Digits10, ExponentType, Allocator> from a given mantissa and exponent.
2199    // Note: This constructor does not maintain the full precision of double.
2200
2201    const bool mantissa_is_iszero = (::fabs(mantissa) < ((std::numeric_limits<double>::min)() * (1.0 + std::numeric_limits<double>::epsilon())));
2202
2203    if (mantissa_is_iszero)
2204    {
2205       std::fill(data.begin(), data.end(), static_cast<boost::uint32_t>(0u));
2206       return;
2207    }
2208
2209    const bool b_neg = (mantissa < 0.0);
2210
2211    double       d = ((!b_neg) ? mantissa : -mantissa);
2212    ExponentType e = exponent;
2213
2214    while (d > 10.0)
2215    {
2216       d /= 10.0;
2217       ++e;
2218    }
2219    while (d < 1.0)
2220    {
2221       d *= 10.0;
2222       --e;
2223    }
2224
2225    boost::int32_t shift = static_cast<boost::int32_t>(e % static_cast<boost::int32_t>(cpp_dec_float_elem_digits10));
2226
2227    while (static_cast<boost::int32_t>(shift-- % cpp_dec_float_elem_digits10) != static_cast<boost::int32_t>(0))
2228    {
2229       d *= 10.0;
2230       --e;
2231    }
2232
2233    exp = e;
2234    neg = b_neg;
2235
2236    std::fill(data.begin(), data.end(), static_cast<boost::uint32_t>(0u));
2237
2238    static const boost::int32_t digit_ratio = static_cast<boost::int32_t>(static_cast<boost::int32_t>(std::numeric_limits<double>::digits10) / static_cast<boost::int32_t>(cpp_dec_float_elem_digits10));
2239    static const boost::int32_t digit_loops = static_cast<boost::int32_t>(digit_ratio + static_cast<boost::int32_t>(2));
2240
2241    for (boost::int32_t i = static_cast<boost::int32_t>(0); i < digit_loops; i++)
2242    {
2243       boost::uint32_t n = static_cast<boost::uint32_t>(static_cast<boost::uint64_t>(d));
2244       data[i]           = static_cast<boost::uint32_t>(n);
2245       d -= static_cast<double>(n);
2246       d *= static_cast<double>(cpp_dec_float_elem_mask);
2247    }
2248 }
2249
2250 template <unsigned Digits10, class ExponentType, class Allocator>
2251 cpp_dec_float<Digits10, ExponentType, Allocator>& cpp_dec_float<Digits10, ExponentType, Allocator>::operator=(long double a)
2252 {
2253    // Christopher Kormanyos's original code used a cast to boost::long_long_type here, but that fails
2254    // when long double has more digits than a boost::long_long_type.
2255    using std::floor;
2256    using std::frexp;
2257    using std::ldexp;
2258
2259    if (a == 0)
2260       return *this = zero();
2261
2262    if (a == 1)
2263       return *this = one();
2264
2265    if ((boost::math::isinf)(a))
2266    {
2267       *this = inf();
2268       if (a < 0)
2269          this->negate();
2270       return *this;
2271    }
2272
2273    if ((boost::math::isnan)(a))
2274       return *this = nan();
2275
2276    int         e;
2277    long double f, term;
2278    *this = zero();
2279
2280    f = frexp(a, &e);
2281    // See https://svn.boost.org/trac/boost/ticket/10924 for an example of why this may go wrong:
2282    BOOST_ASSERT((boost::math::isfinite)(f));
2283
2284    static const int shift = std::numeric_limits<int>::digits - 1;
2285
2286    while (f)
2287    {
2288       // extract int sized bits from f:
2289       f = ldexp(f, shift);
2290       BOOST_ASSERT((boost::math::isfinite)(f));
2291       term = floor(f);
2292       e -= shift;
2293       *this *= pow2(shift);
2294       if (term > 0)
2295          add_unsigned_long_long(static_cast<unsigned>(term));
2296       else
2297          sub_unsigned_long_long(static_cast<unsigned>(-term));
2298       f -= term;
2299    }
2300
2301    if (e != 0)
2302       *this *= pow2(e);
2303
2304    return *this;
2305 }
2306
2307 template <unsigned Digits10, class ExponentType, class Allocator>
2308 void cpp_dec_float<Digits10, ExponentType, Allocator>::from_unsigned_long_long(const boost::ulong_long_type u)
2309 {
2310    std::fill(data.begin(), data.end(), static_cast<boost::uint32_t>(0u));
2311
2312    exp       = static_cast<ExponentType>(0);
2313    neg       = false;
2314    fpclass   = cpp_dec_float_finite;
2315    prec_elem = cpp_dec_float_elem_number;
2316
2317    if (u == 0)
2318    {
2319       return;
2320    }
2321
2322    std::size_t i = static_cast<std::size_t>(0u);
2323
2324    boost::ulong_long_type uu = u;
2325
2326    boost::uint32_t temp[(std::numeric_limits<boost::ulong_long_type>::digits10 / static_cast<int>(cpp_dec_float_elem_digits10)) + 3] = {static_cast<boost::uint32_t>(0u)};
2327
2328    while (uu != static_cast<boost::ulong_long_type>(0u))
2329    {
2330       temp[i] = static_cast<boost::uint32_t>(uu % static_cast<boost::ulong_long_type>(cpp_dec_float_elem_mask));
2331       uu      = static_cast<boost::ulong_long_type>(uu / static_cast<boost::ulong_long_type>(cpp_dec_float_elem_mask));
2332       ++i;
2333    }
2334
2335    if (i > static_cast<std::size_t>(1u))
2336    {
2337       exp += static_cast<ExponentType>((i - 1u) * static_cast<std::size_t>(cpp_dec_float_elem_digits10));
2338    }
2339
2340    std::reverse(temp, temp + i);
2341    std::copy(temp, temp + (std::min)(i, static_cast<std::size_t>(cpp_dec_float_elem_number)), data.begin());
2342 }
2343
2344 template <unsigned Digits10, class ExponentType, class Allocator>
2345 boost::uint32_t cpp_dec_float<Digits10, ExponentType, Allocator>::mul_loop_uv(boost::uint32_t* const u, const boost::uint32_t* const v, const boost::int32_t p)
2346 {
2347    //
2348    // There is a limit on how many limbs this algorithm can handle without dropping digits
2349    // due to overflow in the carry, it is:
2350    //
2351    // FLOOR( (2^64 - 1) / (10^8 * 10^8) ) == 1844
2352    //
2353    BOOST_STATIC_ASSERT_MSG(cpp_dec_float_elem_number < 1800, "Too many limbs in the data type for the multiplication algorithm - unsupported precision in cpp_dec_float.");
2354
2355    boost::uint64_t carry = static_cast<boost::uint64_t>(0u);
2356
2357    for (boost::int32_t j = static_cast<boost::int32_t>(p - 1u); j >= static_cast<boost::int32_t>(0); j--)
2358    {
2359       boost::uint64_t sum = carry;
2360
2361       for (boost::int32_t i = j; i >= static_cast<boost::int32_t>(0); i--)
2362       {
2363          sum += static_cast<boost::uint64_t>(u[j - i] * static_cast<boost::uint64_t>(v[i]));
2364       }
2365
2366       u[j]  = static_cast<boost::uint32_t>(sum % static_cast<boost::uint32_t>(cpp_dec_float_elem_mask));
2367       carry = static_cast<boost::uint64_t>(sum / static_cast<boost::uint32_t>(cpp_dec_float_elem_mask));
2368    }
2369
2370    return static_cast<boost::uint32_t>(carry);
2371 }
2372
2373 template <unsigned Digits10, class ExponentType, class Allocator>
2374 boost::uint32_t cpp_dec_float<Digits10, ExponentType, Allocator>::mul_loop_n(boost::uint32_t* const u, boost::uint32_t n, const boost::int32_t p)
2375 {
2376    boost::uint64_t carry = static_cast<boost::uint64_t>(0u);
2377
2378    // Multiplication loop.
2379    for (boost::int32_t j = p - 1; j >= static_cast<boost::int32_t>(0); j--)
2380    {
2381       const boost::uint64_t t = static_cast<boost::uint64_t>(carry + static_cast<boost::uint64_t>(u[j] * static_cast<boost::uint64_t>(n)));
2382       carry                   = static_cast<boost::uint64_t>(t / static_cast<boost::uint32_t>(cpp_dec_float_elem_mask));
2383       u[j]                    = static_cast<boost::uint32_t>(t - static_cast<boost::uint64_t>(static_cast<boost::uint32_t>(cpp_dec_float_elem_mask) * static_cast<boost::uint64_t>(carry)));
2384    }
2385
2386    return static_cast<boost::uint32_t>(carry);
2387 }
2388
2389 template <unsigned Digits10, class ExponentType, class Allocator>
2390 boost::uint32_t cpp_dec_float<Digits10, ExponentType, Allocator>::div_loop_n(boost::uint32_t* const u, boost::uint32_t n, const boost::int32_t p)
2391 {
2392    boost::uint64_t prev = static_cast<boost::uint64_t>(0u);
2393
2394    for (boost::int32_t j = static_cast<boost::int32_t>(0); j < p; j++)
2395    {
2396       const boost::uint64_t t = static_cast<boost::uint64_t>(u[j] + static_cast<boost::uint64_t>(prev * static_cast<boost::uint32_t>(cpp_dec_float_elem_mask)));
2397       u[j]                    = static_cast<boost::uint32_t>(t / n);
2398       prev                    = static_cast<boost::uint64_t>(t - static_cast<boost::uint64_t>(n * static_cast<boost::uint64_t>(u[j])));
2399    }
2400
2401    return static_cast<boost::uint32_t>(prev);
2402 }
2403
2404 template <unsigned Digits10, class ExponentType, class Allocator>
2405 cpp_dec_float<Digits10, ExponentType, Allocator> cpp_dec_float<Digits10, ExponentType, Allocator>::pow2(const boost::long_long_type p)
2406 {
2407    // Create a static const table of p^2 for -128 < p < +128.
2408    // Note: The size of this table must be odd-numbered and
2409    // symmetric about 0.
2410    init.do_nothing();
2411    static const boost::array<cpp_dec_float<Digits10, ExponentType, Allocator>, 255u> p2_data =
2412        {{cpp_dec_float("5.877471754111437539843682686111228389093327783860437607543758531392086297273635864257812500000000000e-39"),
2413          cpp_dec_float("1.175494350822287507968736537222245677818665556772087521508751706278417259454727172851562500000000000e-38"),
2414          cpp_dec_float("2.350988701644575015937473074444491355637331113544175043017503412556834518909454345703125000000000000e-38"),
2415          cpp_dec_float("4.701977403289150031874946148888982711274662227088350086035006825113669037818908691406250000000000000e-38"),
2416          cpp_dec_float("9.403954806578300063749892297777965422549324454176700172070013650227338075637817382812500000000000000e-38"),
2417          cpp_dec_float("1.880790961315660012749978459555593084509864890835340034414002730045467615127563476562500000000000000e-37"),
2418          cpp_dec_float("3.761581922631320025499956919111186169019729781670680068828005460090935230255126953125000000000000000e-37"),
2419          cpp_dec_float("7.523163845262640050999913838222372338039459563341360137656010920181870460510253906250000000000000000e-37"),
2420          cpp_dec_float("1.504632769052528010199982767644474467607891912668272027531202184036374092102050781250000000000000000e-36"),
2421          cpp_dec_float("3.009265538105056020399965535288948935215783825336544055062404368072748184204101562500000000000000000e-36"),
2422          cpp_dec_float("6.018531076210112040799931070577897870431567650673088110124808736145496368408203125000000000000000000e-36"),
2423          cpp_dec_float("1.203706215242022408159986214115579574086313530134617622024961747229099273681640625000000000000000000e-35"),
2424          cpp_dec_float("2.407412430484044816319972428231159148172627060269235244049923494458198547363281250000000000000000000e-35"),
2425          cpp_dec_float("4.814824860968089632639944856462318296345254120538470488099846988916397094726562500000000000000000000e-35"),
2426          cpp_dec_float("9.629649721936179265279889712924636592690508241076940976199693977832794189453125000000000000000000000e-35"),
2427          cpp_dec_float("1.925929944387235853055977942584927318538101648215388195239938795566558837890625000000000000000000000e-34"),
2428          cpp_dec_float("3.851859888774471706111955885169854637076203296430776390479877591133117675781250000000000000000000000e-34"),
2429          cpp_dec_float("7.703719777548943412223911770339709274152406592861552780959755182266235351562500000000000000000000000e-34"),
2430          cpp_dec_float("1.540743955509788682444782354067941854830481318572310556191951036453247070312500000000000000000000000e-33"),
2431          cpp_dec_float("3.081487911019577364889564708135883709660962637144621112383902072906494140625000000000000000000000000e-33"),
2432          cpp_dec_float("6.162975822039154729779129416271767419321925274289242224767804145812988281250000000000000000000000000e-33"),
2433          cpp_dec_float("1.232595164407830945955825883254353483864385054857848444953560829162597656250000000000000000000000000e-32"),
2434          cpp_dec_float("2.465190328815661891911651766508706967728770109715696889907121658325195312500000000000000000000000000e-32"),
2435          cpp_dec_float("4.930380657631323783823303533017413935457540219431393779814243316650390625000000000000000000000000000e-32"),
2436          cpp_dec_float("9.860761315262647567646607066034827870915080438862787559628486633300781250000000000000000000000000000e-32"),
2437          cpp_dec_float("1.972152263052529513529321413206965574183016087772557511925697326660156250000000000000000000000000000e-31"),
2438          cpp_dec_float("3.944304526105059027058642826413931148366032175545115023851394653320312500000000000000000000000000000e-31"),
2439          cpp_dec_float("7.888609052210118054117285652827862296732064351090230047702789306640625000000000000000000000000000000e-31"),
2440          cpp_dec_float("1.577721810442023610823457130565572459346412870218046009540557861328125000000000000000000000000000000e-30"),
2441          cpp_dec_float("3.155443620884047221646914261131144918692825740436092019081115722656250000000000000000000000000000000e-30"),
2442          cpp_dec_float("6.310887241768094443293828522262289837385651480872184038162231445312500000000000000000000000000000000e-30"),
2443          cpp_dec_float("1.262177448353618888658765704452457967477130296174436807632446289062500000000000000000000000000000000e-29"),
2444          cpp_dec_float("2.524354896707237777317531408904915934954260592348873615264892578125000000000000000000000000000000000e-29"),
2445          cpp_dec_float("5.048709793414475554635062817809831869908521184697747230529785156250000000000000000000000000000000000e-29"),
2446          cpp_dec_float("1.009741958682895110927012563561966373981704236939549446105957031250000000000000000000000000000000000e-28"),
2447          cpp_dec_float("2.019483917365790221854025127123932747963408473879098892211914062500000000000000000000000000000000000e-28"),
2448          cpp_dec_float("4.038967834731580443708050254247865495926816947758197784423828125000000000000000000000000000000000000e-28"),
2449          cpp_dec_float("8.077935669463160887416100508495730991853633895516395568847656250000000000000000000000000000000000000e-28"),
2450          cpp_dec_float("1.615587133892632177483220101699146198370726779103279113769531250000000000000000000000000000000000000e-27"),
2451          cpp_dec_float("3.231174267785264354966440203398292396741453558206558227539062500000000000000000000000000000000000000e-27"),
2452          cpp_dec_float("6.462348535570528709932880406796584793482907116413116455078125000000000000000000000000000000000000000e-27"),
2453          cpp_dec_float("1.292469707114105741986576081359316958696581423282623291015625000000000000000000000000000000000000000e-26"),
2454          cpp_dec_float("2.584939414228211483973152162718633917393162846565246582031250000000000000000000000000000000000000000e-26"),
2455          cpp_dec_float("5.169878828456422967946304325437267834786325693130493164062500000000000000000000000000000000000000000e-26"),
2456          cpp_dec_float("1.033975765691284593589260865087453566957265138626098632812500000000000000000000000000000000000000000e-25"),
2457          cpp_dec_float("2.067951531382569187178521730174907133914530277252197265625000000000000000000000000000000000000000000e-25"),
2458          cpp_dec_float("4.135903062765138374357043460349814267829060554504394531250000000000000000000000000000000000000000000e-25"),
2459          cpp_dec_float("8.271806125530276748714086920699628535658121109008789062500000000000000000000000000000000000000000000e-25"),
2460          cpp_dec_float("1.654361225106055349742817384139925707131624221801757812500000000000000000000000000000000000000000000e-24"),
2461          cpp_dec_float("3.308722450212110699485634768279851414263248443603515625000000000000000000000000000000000000000000000e-24"),
2462          cpp_dec_float("6.617444900424221398971269536559702828526496887207031250000000000000000000000000000000000000000000000e-24"),
2463          cpp_dec_float("1.323488980084844279794253907311940565705299377441406250000000000000000000000000000000000000000000000e-23"),
2464          cpp_dec_float("2.646977960169688559588507814623881131410598754882812500000000000000000000000000000000000000000000000e-23"),
2465          cpp_dec_float("5.293955920339377119177015629247762262821197509765625000000000000000000000000000000000000000000000000e-23"),
2466          cpp_dec_float("1.058791184067875423835403125849552452564239501953125000000000000000000000000000000000000000000000000e-22"),
2467          cpp_dec_float("2.117582368135750847670806251699104905128479003906250000000000000000000000000000000000000000000000000e-22"),
2468          cpp_dec_float("4.235164736271501695341612503398209810256958007812500000000000000000000000000000000000000000000000000e-22"),
2469          cpp_dec_float("8.470329472543003390683225006796419620513916015625000000000000000000000000000000000000000000000000000e-22"),
2470          cpp_dec_float("1.694065894508600678136645001359283924102783203125000000000000000000000000000000000000000000000000000e-21"),
2471          cpp_dec_float("3.388131789017201356273290002718567848205566406250000000000000000000000000000000000000000000000000000e-21"),
2472          cpp_dec_float("6.776263578034402712546580005437135696411132812500000000000000000000000000000000000000000000000000000e-21"),
2473          cpp_dec_float("1.355252715606880542509316001087427139282226562500000000000000000000000000000000000000000000000000000e-20"),
2474          cpp_dec_float("2.710505431213761085018632002174854278564453125000000000000000000000000000000000000000000000000000000e-20"),
2475          cpp_dec_float("5.421010862427522170037264004349708557128906250000000000000000000000000000000000000000000000000000000e-20"),
2476          cpp_dec_float("1.084202172485504434007452800869941711425781250000000000000000000000000000000000000000000000000000000e-19"),
2477          cpp_dec_float("2.168404344971008868014905601739883422851562500000000000000000000000000000000000000000000000000000000e-19"),
2478          cpp_dec_float("4.336808689942017736029811203479766845703125000000000000000000000000000000000000000000000000000000000e-19"),
2479          cpp_dec_float("8.673617379884035472059622406959533691406250000000000000000000000000000000000000000000000000000000000e-19"),
2480          cpp_dec_float("1.734723475976807094411924481391906738281250000000000000000000000000000000000000000000000000000000000e-18"),
2481          cpp_dec_float("3.469446951953614188823848962783813476562500000000000000000000000000000000000000000000000000000000000e-18"),
2482          cpp_dec_float("6.938893903907228377647697925567626953125000000000000000000000000000000000000000000000000000000000000e-18"),
2483          cpp_dec_float("1.387778780781445675529539585113525390625000000000000000000000000000000000000000000000000000000000000e-17"),
2484          cpp_dec_float("2.775557561562891351059079170227050781250000000000000000000000000000000000000000000000000000000000000e-17"),
2485          cpp_dec_float("5.551115123125782702118158340454101562500000000000000000000000000000000000000000000000000000000000000e-17"),
2486          cpp_dec_float("1.110223024625156540423631668090820312500000000000000000000000000000000000000000000000000000000000000e-16"),
2487          cpp_dec_float("2.220446049250313080847263336181640625000000000000000000000000000000000000000000000000000000000000000e-16"),
2488          cpp_dec_float("4.440892098500626161694526672363281250000000000000000000000000000000000000000000000000000000000000000e-16"),
2489          cpp_dec_float("8.881784197001252323389053344726562500000000000000000000000000000000000000000000000000000000000000000e-16"),
2490          cpp_dec_float("1.776356839400250464677810668945312500000000000000000000000000000000000000000000000000000000000000000e-15"),
2491          cpp_dec_float("3.552713678800500929355621337890625000000000000000000000000000000000000000000000000000000000000000000e-15"),
2492          cpp_dec_float("7.105427357601001858711242675781250000000000000000000000000000000000000000000000000000000000000000000e-15"),
2493          cpp_dec_float("1.421085471520200371742248535156250000000000000000000000000000000000000000000000000000000000000000000e-14"),
2494          cpp_dec_float("2.842170943040400743484497070312500000000000000000000000000000000000000000000000000000000000000000000e-14"),
2495          cpp_dec_float("5.684341886080801486968994140625000000000000000000000000000000000000000000000000000000000000000000000e-14"),
2496          cpp_dec_float("1.136868377216160297393798828125000000000000000000000000000000000000000000000000000000000000000000000e-13"),
2497          cpp_dec_float("2.273736754432320594787597656250000000000000000000000000000000000000000000000000000000000000000000000e-13"),
2498          cpp_dec_float("4.547473508864641189575195312500000000000000000000000000000000000000000000000000000000000000000000000e-13"),
2499          cpp_dec_float("9.094947017729282379150390625000000000000000000000000000000000000000000000000000000000000000000000000e-13"),
2500          cpp_dec_float("1.818989403545856475830078125000000000000000000000000000000000000000000000000000000000000000000000000e-12"),
2501          cpp_dec_float("3.637978807091712951660156250000000000000000000000000000000000000000000000000000000000000000000000000e-12"),
2502          cpp_dec_float("7.275957614183425903320312500000000000000000000000000000000000000000000000000000000000000000000000000e-12"),
2503          cpp_dec_float("1.455191522836685180664062500000000000000000000000000000000000000000000000000000000000000000000000000e-11"),
2504          cpp_dec_float("2.910383045673370361328125000000000000000000000000000000000000000000000000000000000000000000000000000e-11"),
2505          cpp_dec_float("5.820766091346740722656250000000000000000000000000000000000000000000000000000000000000000000000000000e-11"),
2506          cpp_dec_float("1.164153218269348144531250000000000000000000000000000000000000000000000000000000000000000000000000000e-10"),
2507          cpp_dec_float("2.328306436538696289062500000000000000000000000000000000000000000000000000000000000000000000000000000e-10"),
2508          cpp_dec_float("4.656612873077392578125000000000000000000000000000000000000000000000000000000000000000000000000000000e-10"),
2509          cpp_dec_float("9.313225746154785156250000000000000000000000000000000000000000000000000000000000000000000000000000000e-10"),
2510          cpp_dec_float("1.862645149230957031250000000000000000000000000000000000000000000000000000000000000000000000000000000e-9"),
2511          cpp_dec_float("3.725290298461914062500000000000000000000000000000000000000000000000000000000000000000000000000000000e-9"),
2512          cpp_dec_float("7.450580596923828125000000000000000000000000000000000000000000000000000000000000000000000000000000000e-9"),
2513          cpp_dec_float("1.490116119384765625000000000000000000000000000000000000000000000000000000000000000000000000000000000e-8"),
2514          cpp_dec_float("2.980232238769531250000000000000000000000000000000000000000000000000000000000000000000000000000000000e-8"),
2515          cpp_dec_float("5.960464477539062500000000000000000000000000000000000000000000000000000000000000000000000000000000000e-8"),
2516          cpp_dec_float("1.192092895507812500000000000000000000000000000000000000000000000000000000000000000000000000000000000e-7"),
2517          cpp_dec_float("2.384185791015625000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-7"),
2518          cpp_dec_float("4.768371582031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-7"),
2519          cpp_dec_float("9.536743164062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-7"),
2520          cpp_dec_float("1.907348632812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-6"),
2521          cpp_dec_float("3.814697265625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-6"),
2522          cpp_dec_float("7.629394531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-6"),
2523          cpp_dec_float("0.000015258789062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000"),
2524          cpp_dec_float("0.000030517578125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"),
2525          cpp_dec_float("0.000061035156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"),
2526          cpp_dec_float("0.000122070312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"),
2527          cpp_dec_float("0.000244140625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"),
2528          cpp_dec_float("0.000488281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"),
2529          cpp_dec_float("0.000976562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"),
2530          cpp_dec_float("0.001953125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"),
2531          cpp_dec_float("0.003906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"),
2532          cpp_dec_float("0.007812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"),
2533          cpp_dec_float("0.01562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"),
2534          cpp_dec_float("0.03125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"),
2535          cpp_dec_float("0.06250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"),
2536          cpp_dec_float("0.125"),
2537          cpp_dec_float("0.25"),
2538          cpp_dec_float("0.5"),
2539          one(),
2540          two(),
2541          cpp_dec_float(static_cast<boost::ulong_long_type>(4)),
2542          cpp_dec_float(static_cast<boost::ulong_long_type>(8)),
2543          cpp_dec_float(static_cast<boost::ulong_long_type>(16)),
2544          cpp_dec_float(static_cast<boost::ulong_long_type>(32)),
2545          cpp_dec_float(static_cast<boost::ulong_long_type>(64)),
2546          cpp_dec_float(static_cast<boost::ulong_long_type>(128)),
2547          cpp_dec_float(static_cast<boost::ulong_long_type>(256)),
2548          cpp_dec_float(static_cast<boost::ulong_long_type>(512)),
2549          cpp_dec_float(static_cast<boost::ulong_long_type>(1024)),
2550          cpp_dec_float(static_cast<boost::ulong_long_type>(2048)),
2551          cpp_dec_float(static_cast<boost::ulong_long_type>(4096)),
2552          cpp_dec_float(static_cast<boost::ulong_long_type>(8192)),
2553          cpp_dec_float(static_cast<boost::ulong_long_type>(16384)),
2554          cpp_dec_float(static_cast<boost::ulong_long_type>(32768)),
2555          cpp_dec_float(static_cast<boost::ulong_long_type>(65536)),
2556          cpp_dec_float(static_cast<boost::ulong_long_type>(131072)),
2557          cpp_dec_float(static_cast<boost::ulong_long_type>(262144)),
2558          cpp_dec_float(static_cast<boost::ulong_long_type>(524288)),
2559          cpp_dec_float(static_cast<boost::uint64_t>(1uL << 20u)),
2560          cpp_dec_float(static_cast<boost::uint64_t>(1uL << 21u)),
2561          cpp_dec_float(static_cast<boost::uint64_t>(1uL << 22u)),
2562          cpp_dec_float(static_cast<boost::uint64_t>(1uL << 23u)),
2563          cpp_dec_float(static_cast<boost::uint64_t>(1uL << 24u)),
2564          cpp_dec_float(static_cast<boost::uint64_t>(1uL << 25u)),
2565          cpp_dec_float(static_cast<boost::uint64_t>(1uL << 26u)),
2566          cpp_dec_float(static_cast<boost::uint64_t>(1uL << 27u)),
2567          cpp_dec_float(static_cast<boost::uint64_t>(1uL << 28u)),
2568          cpp_dec_float(static_cast<boost::uint64_t>(1uL << 29u)),
2569          cpp_dec_float(static_cast<boost::uint64_t>(1uL << 30u)),
2570          cpp_dec_float(static_cast<boost::uint64_t>(1uL << 31u)),
2571          cpp_dec_float(static_cast<boost::uint64_t>(1uLL << 32u)),
2572          cpp_dec_float(static_cast<boost::uint64_t>(1uLL << 33u)),
2573          cpp_dec_float(static_cast<boost::uint64_t>(1uLL << 34u)),
2574          cpp_dec_float(static_cast<boost::uint64_t>(1uLL << 35u)),
2575          cpp_dec_float(static_cast<boost::uint64_t>(1uLL << 36u)),
2576          cpp_dec_float(static_cast<boost::uint64_t>(1uLL << 37u)),
2577          cpp_dec_float(static_cast<boost::uint64_t>(1uLL << 38u)),
2578          cpp_dec_float(static_cast<boost::uint64_t>(1uLL << 39u)),
2579          cpp_dec_float(static_cast<boost::uint64_t>(1uLL << 40u)),
2580          cpp_dec_float(static_cast<boost::uint64_t>(1uLL << 41u)),
2581          cpp_dec_float(static_cast<boost::uint64_t>(1uLL << 42u)),
2582          cpp_dec_float(static_cast<boost::uint64_t>(1uLL << 43u)),
2583          cpp_dec_float(static_cast<boost::uint64_t>(1uLL << 44u)),
2584          cpp_dec_float(static_cast<boost::uint64_t>(1uLL << 45u)),
2585          cpp_dec_float(static_cast<boost::uint64_t>(1uLL << 46u)),
2586          cpp_dec_float(static_cast<boost::uint64_t>(1uLL << 47u)),
2587          cpp_dec_float(static_cast<boost::uint64_t>(1uLL << 48u)),
2588          cpp_dec_float(static_cast<boost::uint64_t>(1uLL << 49u)),
2589          cpp_dec_float(static_cast<boost::uint64_t>(1uLL << 50u)),
2590          cpp_dec_float(static_cast<boost::uint64_t>(1uLL << 51u)),
2591          cpp_dec_float(static_cast<boost::uint64_t>(1uLL << 52u)),
2592          cpp_dec_float(static_cast<boost::uint64_t>(1uLL << 53u)),
2593          cpp_dec_float(static_cast<boost::uint64_t>(1uLL << 54u)),
2594          cpp_dec_float(static_cast<boost::uint64_t>(1uLL << 55u)),
2595          cpp_dec_float(static_cast<boost::uint64_t>(1uLL << 56u)),
2596          cpp_dec_float(static_cast<boost::uint64_t>(1uLL << 57u)),
2597          cpp_dec_float(static_cast<boost::uint64_t>(1uLL << 58u)),
2598          cpp_dec_float(static_cast<boost::uint64_t>(1uLL << 59u)),
2599          cpp_dec_float(static_cast<boost::uint64_t>(1uLL << 60u)),
2600          cpp_dec_float(static_cast<boost::uint64_t>(1uLL << 61u)),
2601          cpp_dec_float(static_cast<boost::uint64_t>(1uLL << 62u)),
2602          cpp_dec_float(static_cast<boost::uint64_t>(1uLL << 63u)),
2603          cpp_dec_float("1.844674407370955161600000000000000000000000000000000000000000000000000000000000000000000000000000000e19"),
2604          cpp_dec_float("3.689348814741910323200000000000000000000000000000000000000000000000000000000000000000000000000000000e19"),
2605          cpp_dec_float("7.378697629483820646400000000000000000000000000000000000000000000000000000000000000000000000000000000e19"),
2606          cpp_dec_float("1.475739525896764129280000000000000000000000000000000000000000000000000000000000000000000000000000000e20"),
2607          cpp_dec_float("2.951479051793528258560000000000000000000000000000000000000000000000000000000000000000000000000000000e20"),
2608          cpp_dec_float("5.902958103587056517120000000000000000000000000000000000000000000000000000000000000000000000000000000e20"),
2609          cpp_dec_float("1.180591620717411303424000000000000000000000000000000000000000000000000000000000000000000000000000000e21"),
2610          cpp_dec_float("2.361183241434822606848000000000000000000000000000000000000000000000000000000000000000000000000000000e21"),
2611          cpp_dec_float("4.722366482869645213696000000000000000000000000000000000000000000000000000000000000000000000000000000e21"),
2612          cpp_dec_float("9.444732965739290427392000000000000000000000000000000000000000000000000000000000000000000000000000000e21"),
2613          cpp_dec_float("1.888946593147858085478400000000000000000000000000000000000000000000000000000000000000000000000000000e22"),
2614          cpp_dec_float("3.777893186295716170956800000000000000000000000000000000000000000000000000000000000000000000000000000e22"),
2615          cpp_dec_float("7.555786372591432341913600000000000000000000000000000000000000000000000000000000000000000000000000000e22"),
2616          cpp_dec_float("1.511157274518286468382720000000000000000000000000000000000000000000000000000000000000000000000000000e23"),
2617          cpp_dec_float("3.022314549036572936765440000000000000000000000000000000000000000000000000000000000000000000000000000e23"),
2618          cpp_dec_float("6.044629098073145873530880000000000000000000000000000000000000000000000000000000000000000000000000000e23"),
2619          cpp_dec_float("1.208925819614629174706176000000000000000000000000000000000000000000000000000000000000000000000000000e24"),
2620          cpp_dec_float("2.417851639229258349412352000000000000000000000000000000000000000000000000000000000000000000000000000e24"),
2621          cpp_dec_float("4.835703278458516698824704000000000000000000000000000000000000000000000000000000000000000000000000000e24"),
2622          cpp_dec_float("9.671406556917033397649408000000000000000000000000000000000000000000000000000000000000000000000000000e24"),
2623          cpp_dec_float("1.934281311383406679529881600000000000000000000000000000000000000000000000000000000000000000000000000e25"),
2624          cpp_dec_float("3.868562622766813359059763200000000000000000000000000000000000000000000000000000000000000000000000000e25"),
2625          cpp_dec_float("7.737125245533626718119526400000000000000000000000000000000000000000000000000000000000000000000000000e25"),
2626          cpp_dec_float("1.547425049106725343623905280000000000000000000000000000000000000000000000000000000000000000000000000e26"),
2627          cpp_dec_float("3.094850098213450687247810560000000000000000000000000000000000000000000000000000000000000000000000000e26"),
2628          cpp_dec_float("6.189700196426901374495621120000000000000000000000000000000000000000000000000000000000000000000000000e26"),
2629          cpp_dec_float("1.237940039285380274899124224000000000000000000000000000000000000000000000000000000000000000000000000e27"),
2630          cpp_dec_float("2.475880078570760549798248448000000000000000000000000000000000000000000000000000000000000000000000000e27"),
2631          cpp_dec_float("4.951760157141521099596496896000000000000000000000000000000000000000000000000000000000000000000000000e27"),
2632          cpp_dec_float("9.903520314283042199192993792000000000000000000000000000000000000000000000000000000000000000000000000e27"),
2633          cpp_dec_float("1.980704062856608439838598758400000000000000000000000000000000000000000000000000000000000000000000000e28"),
2634          cpp_dec_float("3.961408125713216879677197516800000000000000000000000000000000000000000000000000000000000000000000000e28"),
2635          cpp_dec_float("7.922816251426433759354395033600000000000000000000000000000000000000000000000000000000000000000000000e28"),
2636          cpp_dec_float("1.584563250285286751870879006720000000000000000000000000000000000000000000000000000000000000000000000e29"),
2637          cpp_dec_float("3.169126500570573503741758013440000000000000000000000000000000000000000000000000000000000000000000000e29"),
2638          cpp_dec_float("6.338253001141147007483516026880000000000000000000000000000000000000000000000000000000000000000000000e29"),
2639          cpp_dec_float("1.267650600228229401496703205376000000000000000000000000000000000000000000000000000000000000000000000e30"),
2640          cpp_dec_float("2.535301200456458802993406410752000000000000000000000000000000000000000000000000000000000000000000000e30"),
2641          cpp_dec_float("5.070602400912917605986812821504000000000000000000000000000000000000000000000000000000000000000000000e30"),
2642          cpp_dec_float("1.014120480182583521197362564300800000000000000000000000000000000000000000000000000000000000000000000e31"),
2643          cpp_dec_float("2.028240960365167042394725128601600000000000000000000000000000000000000000000000000000000000000000000e31"),
2644          cpp_dec_float("4.056481920730334084789450257203200000000000000000000000000000000000000000000000000000000000000000000e31"),
2645          cpp_dec_float("8.112963841460668169578900514406400000000000000000000000000000000000000000000000000000000000000000000e31"),
2646          cpp_dec_float("1.622592768292133633915780102881280000000000000000000000000000000000000000000000000000000000000000000e32"),
2647          cpp_dec_float("3.245185536584267267831560205762560000000000000000000000000000000000000000000000000000000000000000000e32"),
2648          cpp_dec_float("6.490371073168534535663120411525120000000000000000000000000000000000000000000000000000000000000000000e32"),
2649          cpp_dec_float("1.298074214633706907132624082305024000000000000000000000000000000000000000000000000000000000000000000e33"),
2650          cpp_dec_float("2.596148429267413814265248164610048000000000000000000000000000000000000000000000000000000000000000000e33"),
2651          cpp_dec_float("5.192296858534827628530496329220096000000000000000000000000000000000000000000000000000000000000000000e33"),
2652          cpp_dec_float("1.038459371706965525706099265844019200000000000000000000000000000000000000000000000000000000000000000e34"),
2653          cpp_dec_float("2.076918743413931051412198531688038400000000000000000000000000000000000000000000000000000000000000000e34"),
2654          cpp_dec_float("4.153837486827862102824397063376076800000000000000000000000000000000000000000000000000000000000000000e34"),
2655          cpp_dec_float("8.307674973655724205648794126752153600000000000000000000000000000000000000000000000000000000000000000e34"),
2656          cpp_dec_float("1.661534994731144841129758825350430720000000000000000000000000000000000000000000000000000000000000000e35"),
2657          cpp_dec_float("3.323069989462289682259517650700861440000000000000000000000000000000000000000000000000000000000000000e35"),
2658          cpp_dec_float("6.646139978924579364519035301401722880000000000000000000000000000000000000000000000000000000000000000e35"),
2659          cpp_dec_float("1.329227995784915872903807060280344576000000000000000000000000000000000000000000000000000000000000000e36"),
2660          cpp_dec_float("2.658455991569831745807614120560689152000000000000000000000000000000000000000000000000000000000000000e36"),
2661          cpp_dec_float("5.316911983139663491615228241121378304000000000000000000000000000000000000000000000000000000000000000e36"),
2662          cpp_dec_float("1.063382396627932698323045648224275660800000000000000000000000000000000000000000000000000000000000000e37"),
2663          cpp_dec_float("2.126764793255865396646091296448551321600000000000000000000000000000000000000000000000000000000000000e37"),
2664          cpp_dec_float("4.253529586511730793292182592897102643200000000000000000000000000000000000000000000000000000000000000e37"),
2665          cpp_dec_float("8.507059173023461586584365185794205286400000000000000000000000000000000000000000000000000000000000000e37"),
2666          cpp_dec_float("1.701411834604692317316873037158841057280000000000000000000000000000000000000000000000000000000000000e38")}};
2667
2668    if ((p > static_cast<boost::long_long_type>(-128)) && (p < static_cast<boost::long_long_type>(+128)))
2669    {
2670       return p2_data[static_cast<std::size_t>(p + ((p2_data.size() - 1u) / 2u))];
2671    }
2672    else
2673    {
2674       // Compute and return 2^p.
2675       if (p < static_cast<boost::long_long_type>(0))
2676       {
2677          return pow2(static_cast<boost::long_long_type>(-p)).calculate_inv();
2678       }
2679       else
2680       {
2681          cpp_dec_float<Digits10, ExponentType, Allocator> t;
2682          default_ops::detail::pow_imp(t, two(), p, mpl::true_());
2683          return t;
2684       }
2685    }
2686 }
2687
2688 template <unsigned Digits10, class ExponentType, class Allocator>
2689 inline void eval_add(cpp_dec_float<Digits10, ExponentType, Allocator>& result, const cpp_dec_float<Digits10, ExponentType, Allocator>& o)
2690 {
2691    result += o;
2692 }
2693 template <unsigned Digits10, class ExponentType, class Allocator>
2694 inline void eval_subtract(cpp_dec_float<Digits10, ExponentType, Allocator>& result, const cpp_dec_float<Digits10, ExponentType, Allocator>& o)
2695 {
2696    result -= o;
2697 }
2698 template <unsigned Digits10, class ExponentType, class Allocator>
2699 inline void eval_multiply(cpp_dec_float<Digits10, ExponentType, Allocator>& result, const cpp_dec_float<Digits10, ExponentType, Allocator>& o)
2700 {
2701    result *= o;
2702 }
2703 template <unsigned Digits10, class ExponentType, class Allocator>
2704 inline void eval_divide(cpp_dec_float<Digits10, ExponentType, Allocator>& result, const cpp_dec_float<Digits10, ExponentType, Allocator>& o)
2705 {
2706    result /= o;
2707 }
2708
2709 template <unsigned Digits10, class ExponentType, class Allocator>
2710 inline void eval_add(cpp_dec_float<Digits10, ExponentType, Allocator>& result, const boost::ulong_long_type& o)
2711 {
2712    result.add_unsigned_long_long(o);
2713 }
2714 template <unsigned Digits10, class ExponentType, class Allocator>
2715 inline void eval_subtract(cpp_dec_float<Digits10, ExponentType, Allocator>& result, const boost::ulong_long_type& o)
2716 {
2717    result.sub_unsigned_long_long(o);
2718 }
2719 template <unsigned Digits10, class ExponentType, class Allocator>
2720 inline void eval_multiply(cpp_dec_float<Digits10, ExponentType, Allocator>& result, const boost::ulong_long_type& o)
2721 {
2722    result.mul_unsigned_long_long(o);
2723 }
2724 template <unsigned Digits10, class ExponentType, class Allocator>
2725 inline void eval_divide(cpp_dec_float<Digits10, ExponentType, Allocator>& result, const boost::ulong_long_type& o)
2726 {
2727    result.div_unsigned_long_long(o);
2728 }
2729
2730 template <unsigned Digits10, class ExponentType, class Allocator>
2731 inline void eval_add(cpp_dec_float<Digits10, ExponentType, Allocator>& result, boost::long_long_type o)
2732 {
2733    if (o < 0)
2734       result.sub_unsigned_long_long(boost::multiprecision::detail::unsigned_abs(o));
2735    else
2736       result.add_unsigned_long_long(o);
2737 }
2738 template <unsigned Digits10, class ExponentType, class Allocator>
2739 inline void eval_subtract(cpp_dec_float<Digits10, ExponentType, Allocator>& result, boost::long_long_type o)
2740 {
2741    if (o < 0)
2742       result.add_unsigned_long_long(boost::multiprecision::detail::unsigned_abs(o));
2743    else
2744       result.sub_unsigned_long_long(o);
2745 }
2746 template <unsigned Digits10, class ExponentType, class Allocator>
2747 inline void eval_multiply(cpp_dec_float<Digits10, ExponentType, Allocator>& result, boost::long_long_type o)
2748 {
2749    if (o < 0)
2750    {
2751       result.mul_unsigned_long_long(boost::multiprecision::detail::unsigned_abs(o));
2752       result.negate();
2753    }
2754    else
2755       result.mul_unsigned_long_long(o);
2756 }
2757 template <unsigned Digits10, class ExponentType, class Allocator>
2758 inline void eval_divide(cpp_dec_float<Digits10, ExponentType, Allocator>& result, boost::long_long_type o)
2759 {
2760    if (o < 0)
2761    {
2762       result.div_unsigned_long_long(boost::multiprecision::detail::unsigned_abs(o));
2763       result.negate();
2764    }
2765    else
2766       result.div_unsigned_long_long(o);
2767 }
2768
2769 template <unsigned Digits10, class ExponentType, class Allocator>
2770 inline void eval_convert_to(boost::ulong_long_type* result, const cpp_dec_float<Digits10, ExponentType, Allocator>& val)
2771 {
2772    *result = val.extract_unsigned_long_long();
2773 }
2774 template <unsigned Digits10, class ExponentType, class Allocator>
2775 inline void eval_convert_to(boost::long_long_type* result, const cpp_dec_float<Digits10, ExponentType, Allocator>& val)
2776 {
2777    *result = val.extract_signed_long_long();
2778 }
2779 template <unsigned Digits10, class ExponentType, class Allocator>
2780 inline void eval_convert_to(long double* result, cpp_dec_float<Digits10, ExponentType, Allocator>& val)
2781 {
2782    *result = val.extract_long_double();
2783 }
2784
2785 //
2786 // Non member function support:
2787 //
2788 template <unsigned Digits10, class ExponentType, class Allocator>
2789 inline int eval_fpclassify(const cpp_dec_float<Digits10, ExponentType, Allocator>& x)
2790 {
2791    if ((x.isinf)())
2792       return FP_INFINITE;
2793    if ((x.isnan)())
2794       return FP_NAN;
2795    if (x.iszero())
2796       return FP_ZERO;
2797    return FP_NORMAL;
2798 }
2799
2800 template <unsigned Digits10, class ExponentType, class Allocator>
2801 inline void eval_abs(cpp_dec_float<Digits10, ExponentType, Allocator>& result, const cpp_dec_float<Digits10, ExponentType, Allocator>& x)
2802 {
2803    result = x;
2804    if (x.isneg())
2805       result.negate();
2806 }
2807
2808 template <unsigned Digits10, class ExponentType, class Allocator>
2809 inline void eval_fabs(cpp_dec_float<Digits10, ExponentType, Allocator>& result, const cpp_dec_float<Digits10, ExponentType, Allocator>& x)
2810 {
2811    result = x;
2812    if (x.isneg())
2813       result.negate();
2814 }
2815
2816 template <unsigned Digits10, class ExponentType, class Allocator>
2817 inline void eval_sqrt(cpp_dec_float<Digits10, ExponentType, Allocator>& result, const cpp_dec_float<Digits10, ExponentType, Allocator>& x)
2818 {
2819    result = x;
2820    result.calculate_sqrt();
2821 }
2822
2823 template <unsigned Digits10, class ExponentType, class Allocator>
2824 inline void eval_floor(cpp_dec_float<Digits10, ExponentType, Allocator>& result, const cpp_dec_float<Digits10, ExponentType, Allocator>& x)
2825 {
2826    result = x;
2827    if (!(x.isfinite)() || x.isint())
2828    {
2829       if ((x.isnan)())
2830          errno = EDOM;
2831       return;
2832    }
2833
2834    if (x.isneg())
2835       result -= cpp_dec_float<Digits10, ExponentType, Allocator>::one();
2836    result = result.extract_integer_part();
2837 }
2838
2839 template <unsigned Digits10, class ExponentType, class Allocator>
2840 inline void eval_ceil(cpp_dec_float<Digits10, ExponentType, Allocator>& result, const cpp_dec_float<Digits10, ExponentType, Allocator>& x)
2841 {
2842    result = x;
2843    if (!(x.isfinite)() || x.isint())
2844    {
2845       if ((x.isnan)())
2846          errno = EDOM;
2847       return;
2848    }
2849
2850    if (!x.isneg())
2851       result += cpp_dec_float<Digits10, ExponentType, Allocator>::one();
2852    result = result.extract_integer_part();
2853 }
2854
2855 template <unsigned Digits10, class ExponentType, class Allocator>
2856 inline void eval_trunc(cpp_dec_float<Digits10, ExponentType, Allocator>& result, const cpp_dec_float<Digits10, ExponentType, Allocator>& x)
2857 {
2858    if (x.isint() || !(x.isfinite)())
2859    {
2860       result = x;
2861       if ((x.isnan)())
2862          errno = EDOM;
2863       return;
2864    }
2865    result = x.extract_integer_part();
2866 }
2867
2868 template <unsigned Digits10, class ExponentType, class Allocator>
2869 inline ExponentType eval_ilogb(const cpp_dec_float<Digits10, ExponentType, Allocator>& val)
2870 {
2871    if (val.iszero())
2872       return (std::numeric_limits<ExponentType>::min)();
2873    if ((val.isinf)())
2874       return INT_MAX;
2875    if ((val.isnan)())
2876 #ifdef FP_ILOGBNAN
2877       return FP_ILOGBNAN;
2878 #else
2879       return INT_MAX;
2880 #endif
2881    // Set result, to the exponent of val:
2882    return val.order();
2883 }
2884 template <unsigned Digits10, class ExponentType, class Allocator, class ArgType>
2885 inline void eval_scalbn(cpp_dec_float<Digits10, ExponentType, Allocator>& result, const cpp_dec_float<Digits10, ExponentType, Allocator>& val, ArgType e_)
2886 {
2887    using default_ops::eval_multiply;
2888    const ExponentType                               e = static_cast<ExponentType>(e_);
2889    cpp_dec_float<Digits10, ExponentType, Allocator> t(1.0, e);
2890    eval_multiply(result, val, t);
2891 }
2892
2893 template <unsigned Digits10, class ExponentType, class Allocator, class ArgType>
2894 inline void eval_ldexp(cpp_dec_float<Digits10, ExponentType, Allocator>& result, const cpp_dec_float<Digits10, ExponentType, Allocator>& x, ArgType e)
2895 {
2896    const boost::long_long_type the_exp = static_cast<boost::long_long_type>(e);
2897
2898    if ((the_exp > (std::numeric_limits<ExponentType>::max)()) || (the_exp < (std::numeric_limits<ExponentType>::min)()))
2899       BOOST_THROW_EXCEPTION(std::runtime_error(std::string("Exponent value is out of range.")));
2900
2901    result = x;
2902
2903    if ((the_exp > static_cast<boost::long_long_type>(-std::numeric_limits<boost::long_long_type>::digits)) && (the_exp < static_cast<boost::long_long_type>(0)))
2904       result.div_unsigned_long_long(1ULL << static_cast<boost::long_long_type>(-the_exp));
2905    else if ((the_exp < static_cast<boost::long_long_type>(std::numeric_limits<boost::long_long_type>::digits)) && (the_exp > static_cast<boost::long_long_type>(0)))
2906       result.mul_unsigned_long_long(1ULL << the_exp);
2907    else if (the_exp != static_cast<boost::long_long_type>(0))
2908       result *= cpp_dec_float<Digits10, ExponentType, Allocator>::pow2(e);
2909 }
2910
2911 template <unsigned Digits10, class ExponentType, class Allocator>
2912 inline void eval_frexp(cpp_dec_float<Digits10, ExponentType, Allocator>& result, const cpp_dec_float<Digits10, ExponentType, Allocator>& x, ExponentType* e)
2913 {
2914    result = x;
2915
2916    if (result.iszero() || (result.isinf)() || (result.isnan)())
2917    {
2918       *e = 0;
2919       return;
2920    }
2921
2922    if (result.isneg())
2923       result.negate();
2924
2925    ExponentType t = result.order();
2926    BOOST_MP_USING_ABS
2927    if (abs(t) < ((std::numeric_limits<ExponentType>::max)() / 1000))
2928    {
2929       t *= 1000;
2930       t /= 301;
2931    }
2932    else
2933    {
2934       t /= 301;
2935       t *= 1000;
2936    }
2937
2938    result *= cpp_dec_float<Digits10, ExponentType, Allocator>::pow2(-t);
2939
2940    if (result.iszero() || (result.isinf)() || (result.isnan)())
2941    {
2942       // pow2 overflowed, slip the calculation up:
2943       result = x;
2944       if (result.isneg())
2945          result.negate();
2946       t /= 2;
2947       result *= cpp_dec_float<Digits10, ExponentType, Allocator>::pow2(-t);
2948    }
2949    BOOST_MP_USING_ABS
2950    if (abs(result.order()) > 5)
2951    {
2952       // If our first estimate doesn't get close enough then try recursion until we do:
2953       ExponentType                                     e2;
2954       cpp_dec_float<Digits10, ExponentType, Allocator> r2;
2955       eval_frexp(r2, result, &e2);
2956       // overflow protection:
2957       if ((t > 0) && (e2 > 0) && (t > (std::numeric_limits<ExponentType>::max)() - e2))
2958          BOOST_THROW_EXCEPTION(std::runtime_error("Exponent is too large to be represented as a power of 2."));
2959       if ((t < 0) && (e2 < 0) && (t < (std::numeric_limits<ExponentType>::min)() - e2))
2960          BOOST_THROW_EXCEPTION(std::runtime_error("Exponent is too large to be represented as a power of 2."));
2961       t += e2;
2962       result = r2;
2963    }
2964
2965    while (result.compare(cpp_dec_float<Digits10, ExponentType, Allocator>::one()) >= 0)
2966    {
2967       result /= cpp_dec_float<Digits10, ExponentType, Allocator>::two();
2968       ++t;
2969    }
2970    while (result.compare(cpp_dec_float<Digits10, ExponentType, Allocator>::half()) < 0)
2971    {
2972       result *= cpp_dec_float<Digits10, ExponentType, Allocator>::two();
2973       --t;
2974    }
2975    *e = t;
2976    if (x.isneg())
2977       result.negate();
2978 }
2979
2980 template <unsigned Digits10, class ExponentType, class Allocator>
2981 inline typename disable_if<is_same<ExponentType, int> >::type eval_frexp(cpp_dec_float<Digits10, ExponentType, Allocator>& result, const cpp_dec_float<Digits10, ExponentType, Allocator>& x, int* e)
2982 {
2983    ExponentType t;
2984    eval_frexp(result, x, &t);
2985    if ((t > (std::numeric_limits<int>::max)()) || (t < (std::numeric_limits<int>::min)()))
2986       BOOST_THROW_EXCEPTION(std::runtime_error("Exponent is outside the range of an int"));
2987    *e = static_cast<int>(t);
2988 }
2989
2990 template <unsigned Digits10, class ExponentType, class Allocator>
2991 inline bool eval_is_zero(const cpp_dec_float<Digits10, ExponentType, Allocator>& val)
2992 {
2993    return val.iszero();
2994 }
2995 template <unsigned Digits10, class ExponentType, class Allocator>
2996 inline int eval_get_sign(const cpp_dec_float<Digits10, ExponentType, Allocator>& val)
2997 {
2998    return val.iszero() ? 0 : val.isneg() ? -1 : 1;
2999 }
3000
3001 template <unsigned Digits10, class ExponentType, class Allocator>
3002 inline std::size_t hash_value(const cpp_dec_float<Digits10, ExponentType, Allocator>& val)
3003 {
3004    return val.hash();
3005 }
3006
3007 } // namespace backends
3008
3009 using boost::multiprecision::backends::cpp_dec_float;
3010
3011 typedef number<cpp_dec_float<50> >  cpp_dec_float_50;
3012 typedef number<cpp_dec_float<100> > cpp_dec_float_100;
3013
3014 #ifdef BOOST_NO_SFINAE_EXPR
3015
3016 namespace detail {
3017
3018 template <unsigned D1, class E1, class A1, unsigned D2, class E2, class A2>
3019 struct is_explicitly_convertible<cpp_dec_float<D1, E1, A1>, cpp_dec_float<D2, E2, A2> > : public mpl::true_
3020 {};
3021
3022 } // namespace detail
3023
3024 #endif
3025
3026 }} // namespace boost::multiprecision
3027
3028 namespace std {
3029 template <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
3030 class numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >
3031 {
3032  public:
3033    BOOST_STATIC_CONSTEXPR bool is_specialized                      = true;
3034    BOOST_STATIC_CONSTEXPR bool is_signed                           = true;
3035    BOOST_STATIC_CONSTEXPR bool is_integer                          = false;
3036    BOOST_STATIC_CONSTEXPR bool is_exact                            = false;
3037    BOOST_STATIC_CONSTEXPR bool is_bounded                          = true;
3038    BOOST_STATIC_CONSTEXPR bool is_modulo                           = false;
3039    BOOST_STATIC_CONSTEXPR bool is_iec559                           = false;
3040    BOOST_STATIC_CONSTEXPR int  digits                              = boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_digits10;
3041    BOOST_STATIC_CONSTEXPR int  digits10                            = boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_digits10;
3042    BOOST_STATIC_CONSTEXPR int  max_digits10                        = boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_total_digits10;
3043    BOOST_STATIC_CONSTEXPR ExponentType min_exponent                = boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_min_exp;   // Type differs from int.
3044    BOOST_STATIC_CONSTEXPR ExponentType min_exponent10              = boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_min_exp10; // Type differs from int.
3045    BOOST_STATIC_CONSTEXPR ExponentType max_exponent                = boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_max_exp;   // Type differs from int.
3046    BOOST_STATIC_CONSTEXPR ExponentType max_exponent10              = boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_max_exp10; // Type differs from int.
3047    BOOST_STATIC_CONSTEXPR int          radix                       = boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_radix;
3048    BOOST_STATIC_CONSTEXPR std::float_round_style round_style       = std::round_indeterminate;
3049    BOOST_STATIC_CONSTEXPR bool                   has_infinity      = true;
3050    BOOST_STATIC_CONSTEXPR bool                   has_quiet_NaN     = true;
3051    BOOST_STATIC_CONSTEXPR bool                   has_signaling_NaN = false;
3052    BOOST_STATIC_CONSTEXPR std::float_denorm_style has_denorm       = std::denorm_absent;
3053    BOOST_STATIC_CONSTEXPR bool                    has_denorm_loss  = false;
3054    BOOST_STATIC_CONSTEXPR bool                    traps            = false;
3055    BOOST_STATIC_CONSTEXPR bool                    tinyness_before  = false;
3056
3057    BOOST_STATIC_CONSTEXPR boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates>(min)() { return (boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>::min)(); }
3058    BOOST_STATIC_CONSTEXPR boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates>(max)() { return (boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>::max)(); }
3059    BOOST_STATIC_CONSTEXPR boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> lowest() { return boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>::zero(); }
3060    BOOST_STATIC_CONSTEXPR boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> epsilon() { return boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>::eps(); }
3061    BOOST_STATIC_CONSTEXPR boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> round_error() { return 0.5L; }
3062    BOOST_STATIC_CONSTEXPR boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> infinity() { return boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>::inf(); }
3063    BOOST_STATIC_CONSTEXPR boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> quiet_NaN() { return boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>::nan(); }
3064    BOOST_STATIC_CONSTEXPR boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> signaling_NaN() { return boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>::zero(); }
3065    BOOST_STATIC_CONSTEXPR boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> denorm_min() { return boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>::zero(); }
3066 };
3067
3068 #ifndef BOOST_NO_INCLASS_MEMBER_INITIALIZATION
3069
3070 template <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
3071 BOOST_CONSTEXPR_OR_CONST int numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >::digits;
3072 template <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
3073 BOOST_CONSTEXPR_OR_CONST int numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >::digits10;
3074 template <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
3075 BOOST_CONSTEXPR_OR_CONST int numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >::max_digits10;
3076 template <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
3077 BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >::is_signed;
3078 template <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
3079 BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >::is_integer;
3080 template <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
3081 BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >::is_exact;
3082 template <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
3083 BOOST_CONSTEXPR_OR_CONST int numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >::radix;
3084 template <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
3085 BOOST_CONSTEXPR_OR_CONST ExponentType numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >::min_exponent;
3086 template <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
3087 BOOST_CONSTEXPR_OR_CONST ExponentType numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >::min_exponent10;
3088 template <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
3089 BOOST_CONSTEXPR_OR_CONST ExponentType numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >::max_exponent;
3090 template <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
3091 BOOST_CONSTEXPR_OR_CONST ExponentType numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >::max_exponent10;
3092 template <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
3093 BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >::has_infinity;
3094 template <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
3095 BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >::has_quiet_NaN;
3096 template <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
3097 BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >::has_signaling_NaN;
3098 template <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
3099 BOOST_CONSTEXPR_OR_CONST float_denorm_style numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >::has_denorm;
3100 template <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
3101 BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >::has_denorm_loss;
3102 template <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
3103 BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >::is_iec559;
3104 template <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
3105 BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >::is_bounded;
3106 template <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
3107 BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >::is_modulo;
3108 template <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
3109 BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >::traps;
3110 template <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
3111 BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >::tinyness_before;
3112 template <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
3113 BOOST_CONSTEXPR_OR_CONST float_round_style numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> >::round_style;
3114
3115 #endif
3116 } // namespace std
3117
3118 namespace boost {
3119 namespace math {
3120
3121 namespace policies {
3122
3123 template <unsigned Digits10, class ExponentType, class Allocator, class Policy, boost::multiprecision::expression_template_option ExpressionTemplates>
3124 struct precision<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates>, Policy>
3125 {
3126    // Define a local copy of cpp_dec_float_digits10 because it might differ
3127    // from the template parameter Digits10 for small or large digit counts.
3128    static const boost::int32_t cpp_dec_float_digits10 = boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>::cpp_dec_float_digits10;
3129
3130    typedef typename Policy::precision_type                            precision_type;
3131    typedef digits2<((cpp_dec_float_digits10 + 1LL) * 1000LL) / 301LL> digits_2;
3132    typedef typename mpl::if_c<
3133        ((digits_2::value <= precision_type::value) || (Policy::precision_type::value <= 0)),
3134        // Default case, full precision for RealType:
3135        digits_2,
3136        // User customized precision:
3137        precision_type>::type type;
3138 };
3139
3140 }
3141
3142 }} // namespace boost::math::policies
3143
3144 #ifdef BOOST_MSVC
3145 #pragma warning(pop)
3146 #endif
3147
3148 #endif