blob: 62585ec0cda8b073ef8d334776ccd2679f8a056b [file] [log] [blame]
// Use, modification and distribution are subject to 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)
// Copyright Paul A. Bristow 2012.
// Copyright Christopher Kormanyos 2012.
// This file is written to be included from a Quickbook .qbk document.
// It can be compiled by the C++ compiler, and run. Any output can
// also be added here as comment or included or pasted in elsewhere.
// Caution: this file contains Quickbook markup as well as code
// and comments: don't change any of the special comment markups!
#ifdef _MSC_VER
# pragma warning (disable : 4512) // assignment operator could not be generated.
# pragma warning (disable : 4996)
#endif
//[big_seventh_example_1
/*`[h5 Using Boost.Multiprecision `cpp_float` for numerical calculations with high precision.]
The Boost.Multiprecision library can be used for computations requiring precision
exceeding that of standard built-in types such as float, double
and long double. For extended-precision calculations, Boost.Multiprecision
supplies a template data type called cpp_dec_float. The number of decimal
digits of precision is fixed at compile-time via template parameter.
To use these floating-point types and constants, we need some includes:
*/
#include <boost/math/constants/constants.hpp>
#include <boost/multiprecision/cpp_dec_float.hpp>
// using boost::multiprecision::cpp_dec_float
#include <iostream>
#include <limits>
//` So now we can demonstrate with some trivial calculations:
int main()
{
/*`Using `typedef cpp_dec_float_50` hides the complexity of multiprecision to allow us
to define variables with 50 decimal digit precision just like built-in `double`.
*/
using boost::multiprecision::cpp_dec_float_50;
cpp_dec_float_50 seventh = cpp_dec_float_50(1) / 7;
/*`By default, output would only show the standard 6 decimal digits,
so set precision to show all 50 significant digits.
*/
std::cout.precision(std::numeric_limits<cpp_dec_float_50>::digits10);
std::cout << seventh << std::endl;
/*`which outputs:
0.14285714285714285714285714285714285714285714285714
We can also use constants, guaranteed to be initialized with the very last bit of precision.
*/
cpp_dec_float_50 circumference = boost::math::constants::pi<cpp_dec_float_50>() * 2 * seventh;
std::cout << circumference << std::endl;
/*`which outputs
0.89759790102565521098932668093700082405633411410717
*/
//] [/big_seventh_example_1]
return 0;
} // int main()
/*
//[big_seventh_example_output
0.14285714285714285714285714285714285714285714285714
0.89759790102565521098932668093700082405633411410717
//]
*/