|
| 1 | +// Copyright 2024 Matt Borland |
| 2 | +// Distributed under the Boost Software License, Version 1.0. |
| 3 | +// https://www.boost.org/LICENSE_1_0.txt |
| 4 | +// |
| 5 | +// This file demonstrates some of the basic numerical operations with the decimal types |
| 6 | + |
| 7 | +#include <boost/decimal/decimal64_t.hpp> // For type decimal64_t |
| 8 | +#include <boost/decimal/cmath.hpp> // For decimal overloads of <cmath> functions |
| 9 | +#include <boost/decimal/iostream.hpp> // For decimal support of <iostream> and <iomanip> |
| 10 | +#include <iostream> |
| 11 | +#include <iomanip> |
| 12 | + |
| 13 | +int main() |
| 14 | +{ |
| 15 | + using boost::decimal::decimal64_t; // Type decimal64_t |
| 16 | + |
| 17 | + constexpr decimal64_t a {"-5.123456891234567"}; // Constructs -5.123456 from string |
| 18 | + constexpr decimal64_t b {"3.123456891234567"}; // Constructs 3.123456 from string |
| 19 | + constexpr decimal64_t c {a + b}; |
| 20 | + |
| 21 | + // Here we can see that the result is exact |
| 22 | + constexpr decimal64_t neg_two {-2}; |
| 23 | + static_assert(c == neg_two, "Result should be exact"); |
| 24 | + |
| 25 | + // We can use std::setprecision and std::numeric_limits in their usual ways |
| 26 | + std::cout << std::setprecision(std::numeric_limits<decimal64_t>::digits10) |
| 27 | + << "A: " << a << '\n' |
| 28 | + << "B: " << b << '\n' |
| 29 | + << "A + B: " << c << '\n'; |
| 30 | + |
| 31 | + // The decimal library provides comprehensive implementations of the <cmath> functions |
| 32 | + // that you would expect to have with the builtin floating point types |
| 33 | + // |
| 34 | + // They are all located in namespace boost::decimal::, |
| 35 | + // as overloading namespace std is not allowed |
| 36 | + |
| 37 | + constexpr decimal64_t abs_c {boost::decimal::abs(c)}; |
| 38 | + std::cout << "abs(A + B): " << abs_c << '\n'; |
| 39 | + |
| 40 | + // All cmath functions are constexpr even if their std:: counterparts are not |
| 41 | + constexpr decimal64_t sqrt_two {boost::decimal::sqrt(abs_c)}; |
| 42 | + |
| 43 | + // Value compute by N[Sqrt[2], 50] using Wolfram Alpha or Mathematica |
| 44 | + constexpr decimal64_t wa_sqrt_two {"1.4142135623730950488016887242096980785696718753769"}; |
| 45 | + std::cout << "sqrt(abs(A + B)): " << sqrt_two << '\n' |
| 46 | + << "Wolfram Alpha sqrt(2): " << wa_sqrt_two << '\n'; |
| 47 | +} |
0 commit comments