[/ Copyright 2011 - 2020 John Maddock. Copyright 2013 - 2019 Paul A. Bristow. Copyright 2013 Christopher Kormanyos. Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt). ] [section:cpp_dec_float cpp_dec_float] `#include ` namespace boost{ namespace multiprecision{ template class cpp_dec_float; typedef number > cpp_dec_float_50; typedef number > cpp_dec_float_100; }} // namespaces The `cpp_dec_float` back-end is used in conjunction with `number`: It acts as an entirely C++ (header only and dependency free) floating-point number type that is a drop-in replacement for the native C++ floating-point types, but with much greater precision. Type `cpp_dec_float` can be used at fixed precision by specifying a non-zero `Digits10` template parameter. The typedefs `cpp_dec_float_50` and `cpp_dec_float_100` provide arithmetic types at 50 and 100 decimal digits precision respectively. Optionally, you can specify an integer type to use for the exponent, this defaults to a 32-bit integer type which is more than large enough for the vast majority of use cases, but larger types such as `long long` can also be specified if you need a truly huge exponent range. In any case the ExponentType must be a __fundamental signed integer type at least 2 bytes and 16-bits wide. Normally `cpp_dec_float` allocates no memory: all of the space required for its digits are allocated directly within the class. As a result care should be taken not to use the class with too high a digit count as stack space requirements can grow out of control. If that represents a problem then providing an allocator as the final template parameter causes `cpp_dec_float` to dynamically allocate the memory it needs: this significantly reduces the size of `cpp_dec_float` and increases the viable upper limit on the number of digits at the expense of performance. However, please bear in mind that arithmetic operations rapidly become ['very] expensive as the digit count grows: the current implementation really isn't optimized or designed for large digit counts. There is full standard library and `std::numeric_limits` support available for this type. Things you should know when using this type: * Default constructed `cpp_dec_float`s have a value of zero. * The radix of this type is 10. As a result it can behave subtly differently from base-2 types. * The type has a number of internal guard digits over and above those specified in the template argument. Normally these should not be visible to the user. * The type supports both infinities and NaNs. An infinity is generated whenever the result would overflow, and a NaN is generated for any mathematically undefined operation. * There is a `std::numeric_limits` specialisation for this type. * Any `number` instantiated on this type, is convertible to any other `number` instantiated on this type - for example you can convert from `number >` to `number >`. Narrowing conversions are truncating and `explicit`. * Conversion from a string results in a `std::runtime_error` being thrown if the string can not be interpreted as a valid floating-point number. * The actual precision of a `cpp_dec_float` is always slightly higher than the number of digits specified in the template parameter, actually how much higher is an implementation detail but is always at least 8 decimal digits. * Operations involving `cpp_dec_float` are always truncating. However, note that since there are guard digits in effect, in practice this has no real impact on accuracy for most use cases. [h5 cpp_dec_float example:] [cpp_dec_float_eg] [endsect]