1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/*
22b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    MPFR C++: Multi-precision floating point number class for C++.
37faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    Based on MPFR library:    http://mpfr.org
47faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
57faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    Project homepage:    http://www.holoborodko.com/pavel/mpfr
67faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    Contact e-mail:      pavel@holoborodko.com
77faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
82b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Copyright (c) 2008-2015 Pavel Holoborodko
97faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
107faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    Contributors:
112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Dmitriy Gubanov, Konstantin Holoborodko, Brian Gladman,
122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Helmut Jarausch, Fokko Beekhof, Ulrich Mutze, Heinz van Saanen,
132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Pere Constans, Peter van Hoof, Gael Guennebaud, Tsai Chia Cheng,
14615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    Alexei Zubanov, Jauhien Piatlicki, Victor Berger, John Westwood,
152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Petr Aleksandrov, Orion Poplawski, Charles Karney, Arash Partow,
162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Rodney James, Jorge Leitao.
177faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
18615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    Licensing:
19615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    (A) MPFR C++ is under GNU General Public License ("GPL").
202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    (B) Non-free licenses may also be purchased from the author, for users who
22615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray        do not want their programs protected by the GPL.
237faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        The non-free licenses are for users that wish to use MPFR C++ in
252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        their products but are unwilling to release their software
262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        under the GPL (which would require them to release source code
27615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray        and allow free redistribution).
287faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
29615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray        Such users can purchase an unlimited-use license from the author.
30615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray        Contact us for more details.
312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
32615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    GNU General Public License ("GPL") copyright permissions statement:
33615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    **************************************************************************
34615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    This program is free software: you can redistribute it and/or modify
35615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    it under the terms of the GNU General Public License as published by
36615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    the Free Software Foundation, either version 3 of the License, or
37615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    (at your option) any later version.
38615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray
39615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    This program is distributed in the hope that it will be useful,
40615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    but WITHOUT ANY WARRANTY; without even the implied warranty of
41615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
42615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    GNU General Public License for more details.
43615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray
44615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    You should have received a copy of the GNU General Public License
45615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    along with this program.  If not, see <http://www.gnu.org/licenses/>.
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath*/
47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef __MPREAL_H__
49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define __MPREAL_H__
50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <string>
52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <iostream>
53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <sstream>
54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <stdexcept>
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <cfloat>
56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <cmath>
57615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray#include <cstring>
587faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#include <limits>
592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#include <complex>
602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#include <algorithm>
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Options
637faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#define MPREAL_HAVE_MSVC_DEBUGVIEW              // Enable Debugger Visualizer for "Debug" builds in MSVC.
64615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray#define MPREAL_HAVE_DYNAMIC_STD_NUMERIC_LIMITS  // Enable extended std::numeric_limits<mpfr::mpreal> specialization.
65615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray                                                // Meaning that "digits", "round_style" and similar members are defined as functions, not constants.
66615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray                                                // See std::numeric_limits<mpfr::mpreal> at the end of the file for more information.
67615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray
68615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray// Library version
69615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray#define MPREAL_VERSION_MAJOR 3
702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#define MPREAL_VERSION_MINOR 6
712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#define MPREAL_VERSION_PATCHLEVEL 2
722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#define MPREAL_VERSION_STRING "3.6.2"
73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Detect compiler using signatures from http://predef.sourceforge.net/
752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#if defined(__GNUC__)
762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    #define IsInf(x) (isinf)(x)                 // GNU C++/Intel ICC compiler on Linux
772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#elif defined(_MSC_VER)                         // Microsoft Visual C++
782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    #define IsInf(x) (!_finite(x))
79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#else
802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    #define IsInf(x) (std::isinf)(x)              // GNU C/C++ (and/or other compilers), just hope for C99 conformance
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
83615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray// A Clang feature extension to determine compiler features.
84615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray#ifndef __has_feature
85615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    #define __has_feature(x) 0
86615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray#endif
87615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray
88615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray// Detect support for r-value references (move semantic). Borrowed from Eigen.
89615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray#if (__has_feature(cxx_rvalue_references) || \
90615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray       defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L || \
91615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray      (defined(_MSC_VER) && _MSC_VER >= 1600))
92615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray
93615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    #define MPREAL_HAVE_MOVE_SUPPORT
94615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray
952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // Use fields in mpfr_t structure to check if it was initialized / set dummy initialization
96615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    #define mpfr_is_initialized(x)      (0 != (x)->_mpfr_d)
97615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    #define mpfr_set_uninitialized(x)   ((x)->_mpfr_d = 0 )
98615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray#endif
99615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray
1002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Detect support for explicit converters.
101615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray#if (__has_feature(cxx_explicit_conversions) || \
1022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang       (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GNUC_MINOR__ >= 5) || __cplusplus >= 201103L || \
1032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang       (defined(_MSC_VER) && _MSC_VER >= 1800))
104615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray
105615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    #define MPREAL_HAVE_EXPLICIT_CONVERTERS
106615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray#endif
107615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray
1082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#define MPFR_USE_INTMAX_T   // Enable 64-bit integer types - should be defined before mpfr.h
109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if defined(MPREAL_HAVE_MSVC_DEBUGVIEW) && defined(_MSC_VER) && defined(_DEBUG)
111615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    #define MPREAL_MSVC_DEBUGVIEW_CODE     DebugView = toString();
1127faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    #define MPREAL_MSVC_DEBUGVIEW_DATA     std::string DebugView;
113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#else
1142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    #define MPREAL_MSVC_DEBUGVIEW_CODE
1152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    #define MPREAL_MSVC_DEBUGVIEW_DATA
116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <mpfr.h>
119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if (MPFR_VERSION < MPFR_VERSION_NUM(3,0,0))
1217faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    #include <cstdlib>                          // Needed for random()
1227faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#endif
1237faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1247faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez// Less important options
1252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#define MPREAL_DOUBLE_BITS_OVERFLOW -1          // Triggers overflow exception during conversion to double if mpreal
1267faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                                                // cannot fit in MPREAL_DOUBLE_BITS_OVERFLOW bits
1277faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                                                // = -1 disables overflow checks (default)
1282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Fast replacement for mpfr_set_zero(x, +1):
1302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// (a) uses low-level data members, might not be compatible with new versions of MPFR
1312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// (b) sign is not set, add (x)->_mpfr_sign = 1;
1322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#define mpfr_set_zero_fast(x)  ((x)->_mpfr_exp = __MPFR_EXP_ZERO)
1332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1347faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#if defined(__GNUC__)
1357faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  #define MPREAL_PERMISSIVE_EXPR __extension__
1367faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#else
1377faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  #define MPREAL_PERMISSIVE_EXPR
138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace mpfr {
141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass mpreal {
143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathprivate:
1447faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpfr_t mp;
1452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathpublic:
1472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1487faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // Get default rounding mode & precision
1497faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    inline static mp_rnd_t   get_default_rnd()    {    return (mp_rnd_t)(mpfr_get_default_rounding_mode());       }
1507faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    inline static mp_prec_t  get_default_prec()   {    return mpfr_get_default_prec();                            }
1517faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1527faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // Constructors && type conversions
1537faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal();
1547faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal(const mpreal& u);
1552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpreal(const mpf_t u);
1562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpreal(const mpz_t u,                  mp_prec_t prec = mpreal::get_default_prec(), mp_rnd_t mode = mpreal::get_default_rnd());
1572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpreal(const mpq_t u,                  mp_prec_t prec = mpreal::get_default_prec(), mp_rnd_t mode = mpreal::get_default_rnd());
1582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpreal(const double u,                 mp_prec_t prec = mpreal::get_default_prec(), mp_rnd_t mode = mpreal::get_default_rnd());
1592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpreal(const long double u,            mp_prec_t prec = mpreal::get_default_prec(), mp_rnd_t mode = mpreal::get_default_rnd());
1602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpreal(const unsigned long long int u, mp_prec_t prec = mpreal::get_default_prec(), mp_rnd_t mode = mpreal::get_default_rnd());
1612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpreal(const long long int u,          mp_prec_t prec = mpreal::get_default_prec(), mp_rnd_t mode = mpreal::get_default_rnd());
1622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpreal(const unsigned long int u,      mp_prec_t prec = mpreal::get_default_prec(), mp_rnd_t mode = mpreal::get_default_rnd());
1632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpreal(const unsigned int u,           mp_prec_t prec = mpreal::get_default_prec(), mp_rnd_t mode = mpreal::get_default_rnd());
1642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpreal(const long int u,               mp_prec_t prec = mpreal::get_default_prec(), mp_rnd_t mode = mpreal::get_default_rnd());
1652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpreal(const int u,                    mp_prec_t prec = mpreal::get_default_prec(), mp_rnd_t mode = mpreal::get_default_rnd());
166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // Construct mpreal from mpfr_t structure.
1682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // shared = true allows to avoid deep copy, so that mpreal and 'u' share the same data & pointers.
1692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpreal(const mpfr_t  u, bool shared = false);
170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1717faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal(const char* s,             mp_prec_t prec = mpreal::get_default_prec(), int base = 10, mp_rnd_t mode = mpreal::get_default_rnd());
1727faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal(const std::string& s,      mp_prec_t prec = mpreal::get_default_prec(), int base = 10, mp_rnd_t mode = mpreal::get_default_rnd());
1737faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    ~mpreal();
1757faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
176615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray#ifdef MPREAL_HAVE_MOVE_SUPPORT
177615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpreal& operator=(mpreal&& v);
178615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpreal(mpreal&& u);
179615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray#endif
180615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray
1817faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // Operations
1827faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // =
1832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // +, -, *, /, ++, --, <<, >>
1847faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // *=, +=, -=, /=,
1857faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // <, >, ==, <=, >=
1867faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1877faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // =
1887faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator=(const mpreal& v);
1897faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator=(const mpf_t v);
1907faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator=(const mpz_t v);
1917faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator=(const mpq_t v);
1927faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator=(const long double v);
1932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpreal& operator=(const double v);
1947faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator=(const unsigned long int v);
1952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpreal& operator=(const unsigned long long int v);
1962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpreal& operator=(const long long int v);
1977faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator=(const unsigned int v);
1987faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator=(const long int v);
1997faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator=(const int v);
2007faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator=(const char* s);
2017faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator=(const std::string& s);
2022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename real_t> mpreal& operator= (const std::complex<real_t>& z);
2037faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
2047faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // +
2057faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator+=(const mpreal& v);
2067faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator+=(const mpf_t v);
2077faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator+=(const mpz_t v);
2087faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator+=(const mpq_t v);
2097faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator+=(const long double u);
2107faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator+=(const double u);
2117faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator+=(const unsigned long int u);
2127faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator+=(const unsigned int u);
2137faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator+=(const long int u);
2147faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator+=(const int u);
215c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpreal& operator+=(const long long int  u);
2172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpreal& operator+=(const unsigned long long int u);
2182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpreal& operator-=(const long long int  u);
2192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpreal& operator-=(const unsigned long long int u);
2202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpreal& operator*=(const long long int  u);
2212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpreal& operator*=(const unsigned long long int u);
2222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpreal& operator/=(const long long int  u);
2232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpreal& operator/=(const unsigned long long int u);
224c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2257faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    const mpreal operator+() const;
2267faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator++ ();
2272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const mpreal  operator++ (int);
2287faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
2297faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // -
2307faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator-=(const mpreal& v);
2317faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator-=(const mpz_t v);
2327faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator-=(const mpq_t v);
2337faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator-=(const long double u);
2347faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator-=(const double u);
2357faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator-=(const unsigned long int u);
2367faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator-=(const unsigned int u);
2377faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator-=(const long int u);
2387faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator-=(const int u);
2397faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    const mpreal operator-() const;
2407faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    friend const mpreal operator-(const unsigned long int b, const mpreal& a);
2417faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    friend const mpreal operator-(const unsigned int b,      const mpreal& a);
2427faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    friend const mpreal operator-(const long int b,          const mpreal& a);
2437faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    friend const mpreal operator-(const int b,               const mpreal& a);
2447faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    friend const mpreal operator-(const double b,            const mpreal& a);
2452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpreal& operator-- ();
2467faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    const mpreal  operator-- (int);
2477faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
2487faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // *
2497faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator*=(const mpreal& v);
2507faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator*=(const mpz_t v);
2517faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator*=(const mpq_t v);
2527faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator*=(const long double v);
2537faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator*=(const double v);
2547faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator*=(const unsigned long int v);
2557faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator*=(const unsigned int v);
2567faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator*=(const long int v);
2577faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator*=(const int v);
2582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2597faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // /
2607faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator/=(const mpreal& v);
2617faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator/=(const mpz_t v);
2627faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator/=(const mpq_t v);
2637faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator/=(const long double v);
2647faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator/=(const double v);
2657faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator/=(const unsigned long int v);
2667faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator/=(const unsigned int v);
2677faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator/=(const long int v);
2687faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator/=(const int v);
2697faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    friend const mpreal operator/(const unsigned long int b, const mpreal& a);
2707faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    friend const mpreal operator/(const unsigned int b,      const mpreal& a);
2717faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    friend const mpreal operator/(const long int b,          const mpreal& a);
2727faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    friend const mpreal operator/(const int b,               const mpreal& a);
2737faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    friend const mpreal operator/(const double b,            const mpreal& a);
2747faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
2757faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    //<<= Fast Multiplication by 2^u
2767faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator<<=(const unsigned long int u);
2777faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator<<=(const unsigned int u);
2787faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator<<=(const long int u);
2797faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator<<=(const int u);
2807faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
2817faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    //>>= Fast Division by 2^u
2827faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator>>=(const unsigned long int u);
2837faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator>>=(const unsigned int u);
2847faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator>>=(const long int u);
2857faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal& operator>>=(const int u);
2867faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
2877faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // Type Conversion operators
2882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    bool               toBool      (                        )    const;
2892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    long               toLong      (mp_rnd_t mode = GMP_RNDZ)    const;
2902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    unsigned long      toULong     (mp_rnd_t mode = GMP_RNDZ)    const;
2912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    long long          toLLong     (mp_rnd_t mode = GMP_RNDZ)    const;
2922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    unsigned long long toULLong    (mp_rnd_t mode = GMP_RNDZ)    const;
2932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    float              toFloat     (mp_rnd_t mode = GMP_RNDN)    const;
2942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    double             toDouble    (mp_rnd_t mode = GMP_RNDN)    const;
2952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    long double        toLDouble   (mp_rnd_t mode = GMP_RNDN)    const;
296c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
297615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray#if defined (MPREAL_HAVE_EXPLICIT_CONVERTERS)
2982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    explicit operator bool               () const { return toBool();                 }
2992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    explicit operator int                () const { return int(toLong());            }
3002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    explicit operator long               () const { return toLong();                 }
3012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    explicit operator long long          () const { return toLLong();                }
3022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    explicit operator unsigned           () const { return unsigned(toULong());      }
3032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    explicit operator unsigned long      () const { return toULong();                }
3042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    explicit operator unsigned long long () const { return toULLong();               }
3052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    explicit operator float              () const { return toFloat();                }
3062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    explicit operator double             () const { return toDouble();               }
3072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    explicit operator long double        () const { return toLDouble();              }
308c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
309c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
3107faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // Get raw pointers so that mpreal can be directly used in raw mpfr_* functions
3117faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    ::mpfr_ptr    mpfr_ptr();
3127faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    ::mpfr_srcptr mpfr_ptr()    const;
3137faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    ::mpfr_srcptr mpfr_srcptr() const;
314c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
3157faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // Convert mpreal to string with n significant digits in base b
316615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    // n = -1 -> convert with the maximum available digits
317615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    std::string toString(int n = -1, int b = 10, mp_rnd_t mode = mpreal::get_default_rnd()) const;
318c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
319c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0))
320615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    std::string toString(const std::string& format) const;
321c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
322c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
323615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    std::ostream& output(std::ostream& os) const;
324615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray
3257faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // Math Functions
326615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal sqr (const mpreal& v, mp_rnd_t rnd_mode);
327615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal sqrt(const mpreal& v, mp_rnd_t rnd_mode);
328615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal sqrt(const unsigned long int v, mp_rnd_t rnd_mode);
329615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal cbrt(const mpreal& v, mp_rnd_t rnd_mode);
330615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal root(const mpreal& v, unsigned long int k, mp_rnd_t rnd_mode);
331615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal pow (const mpreal& a, const mpreal& b, mp_rnd_t rnd_mode);
332615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal pow (const mpreal& a, const mpz_t b, mp_rnd_t rnd_mode);
333615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal pow (const mpreal& a, const unsigned long int b, mp_rnd_t rnd_mode);
334615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal pow (const mpreal& a, const long int b, mp_rnd_t rnd_mode);
335615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal pow (const unsigned long int a, const mpreal& b, mp_rnd_t rnd_mode);
336615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal pow (const unsigned long int a, const unsigned long int b, mp_rnd_t rnd_mode);
337615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal fabs(const mpreal& v, mp_rnd_t rnd_mode);
338615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray
339615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal abs(const mpreal& v, mp_rnd_t rnd_mode);
340615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal dim(const mpreal& a, const mpreal& b, mp_rnd_t rnd_mode);
341615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend inline const mpreal mul_2ui(const mpreal& v, unsigned long int k, mp_rnd_t rnd_mode);
342615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend inline const mpreal mul_2si(const mpreal& v, long int k, mp_rnd_t rnd_mode);
343615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend inline const mpreal div_2ui(const mpreal& v, unsigned long int k, mp_rnd_t rnd_mode);
344615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend inline const mpreal div_2si(const mpreal& v, long int k, mp_rnd_t rnd_mode);
3457faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    friend int cmpabs(const mpreal& a,const mpreal& b);
3462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
347615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal log  (const mpreal& v, mp_rnd_t rnd_mode);
348615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal log2 (const mpreal& v, mp_rnd_t rnd_mode);
3492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    friend const mpreal logb (const mpreal& v, mp_rnd_t rnd_mode);
350615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal log10(const mpreal& v, mp_rnd_t rnd_mode);
3512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    friend const mpreal exp  (const mpreal& v, mp_rnd_t rnd_mode);
352615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal exp2 (const mpreal& v, mp_rnd_t rnd_mode);
353615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal exp10(const mpreal& v, mp_rnd_t rnd_mode);
354615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal log1p(const mpreal& v, mp_rnd_t rnd_mode);
355615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal expm1(const mpreal& v, mp_rnd_t rnd_mode);
356615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray
357615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal cos(const mpreal& v, mp_rnd_t rnd_mode);
358615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal sin(const mpreal& v, mp_rnd_t rnd_mode);
359615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal tan(const mpreal& v, mp_rnd_t rnd_mode);
360615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal sec(const mpreal& v, mp_rnd_t rnd_mode);
361615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal csc(const mpreal& v, mp_rnd_t rnd_mode);
362615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal cot(const mpreal& v, mp_rnd_t rnd_mode);
363615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend int sin_cos(mpreal& s, mpreal& c, const mpreal& v, mp_rnd_t rnd_mode);
364615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray
365615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal acos  (const mpreal& v, mp_rnd_t rnd_mode);
366615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal asin  (const mpreal& v, mp_rnd_t rnd_mode);
367615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal atan  (const mpreal& v, mp_rnd_t rnd_mode);
368615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal atan2 (const mpreal& y, const mpreal& x, mp_rnd_t rnd_mode);
369615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal acot  (const mpreal& v, mp_rnd_t rnd_mode);
370615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal asec  (const mpreal& v, mp_rnd_t rnd_mode);
371615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal acsc  (const mpreal& v, mp_rnd_t rnd_mode);
372615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray
373615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal cosh  (const mpreal& v, mp_rnd_t rnd_mode);
374615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal sinh  (const mpreal& v, mp_rnd_t rnd_mode);
375615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal tanh  (const mpreal& v, mp_rnd_t rnd_mode);
376615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal sech  (const mpreal& v, mp_rnd_t rnd_mode);
377615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal csch  (const mpreal& v, mp_rnd_t rnd_mode);
378615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal coth  (const mpreal& v, mp_rnd_t rnd_mode);
379615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal acosh (const mpreal& v, mp_rnd_t rnd_mode);
380615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal asinh (const mpreal& v, mp_rnd_t rnd_mode);
381615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal atanh (const mpreal& v, mp_rnd_t rnd_mode);
382615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal acoth (const mpreal& v, mp_rnd_t rnd_mode);
383615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal asech (const mpreal& v, mp_rnd_t rnd_mode);
384615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal acsch (const mpreal& v, mp_rnd_t rnd_mode);
385615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray
386615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal hypot (const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode);
387615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray
388615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal fac_ui (unsigned long int v,  mp_prec_t prec, mp_rnd_t rnd_mode);
389615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal eint   (const mpreal& v, mp_rnd_t rnd_mode);
390615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray
391615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal gamma    (const mpreal& v, mp_rnd_t rnd_mode);
3922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    friend const mpreal tgamma   (const mpreal& v, mp_rnd_t rnd_mode);
393615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal lngamma  (const mpreal& v, mp_rnd_t rnd_mode);
394615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal lgamma   (const mpreal& v, int *signp, mp_rnd_t rnd_mode);
395615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal zeta     (const mpreal& v, mp_rnd_t rnd_mode);
396615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal erf      (const mpreal& v, mp_rnd_t rnd_mode);
397615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal erfc     (const mpreal& v, mp_rnd_t rnd_mode);
3982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    friend const mpreal besselj0 (const mpreal& v, mp_rnd_t rnd_mode);
3992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    friend const mpreal besselj1 (const mpreal& v, mp_rnd_t rnd_mode);
400615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal besseljn (long n, const mpreal& v, mp_rnd_t rnd_mode);
401615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal bessely0 (const mpreal& v, mp_rnd_t rnd_mode);
402615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal bessely1 (const mpreal& v, mp_rnd_t rnd_mode);
4032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    friend const mpreal besselyn (long n, const mpreal& v, mp_rnd_t rnd_mode);
404615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal fma      (const mpreal& v1, const mpreal& v2, const mpreal& v3, mp_rnd_t rnd_mode);
405615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal fms      (const mpreal& v1, const mpreal& v2, const mpreal& v3, mp_rnd_t rnd_mode);
406615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal agm      (const mpreal& v1, const mpreal& v2, mp_rnd_t rnd_mode);
4072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    friend const mpreal sum      (const mpreal tab[], const unsigned long int n, int& status, mp_rnd_t rnd_mode);
4087faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    friend int sgn(const mpreal& v); // returns -1 or +1
409c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
410c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// MPFR 2.4.0 Specifics
411c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0))
412615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend int          sinh_cosh   (mpreal& s, mpreal& c, const mpreal& v, mp_rnd_t rnd_mode);
413615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal li2         (const mpreal& v,                       mp_rnd_t rnd_mode);
414615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal fmod        (const mpreal& x, const mpreal& y,      mp_rnd_t rnd_mode);
415615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal rec_sqrt    (const mpreal& v,                       mp_rnd_t rnd_mode);
4167faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
4177faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // MATLAB's semantic equivalents
418615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal rem (const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode); // Remainder after division
419615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal mod (const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode); // Modulus after division
420c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
421c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
422c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if (MPFR_VERSION >= MPFR_VERSION_NUM(3,0,0))
423615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal digamma (const mpreal& v,        mp_rnd_t rnd_mode);
424615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal ai      (const mpreal& v,        mp_rnd_t rnd_mode);
425615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal urandom (gmp_randstate_t& state, mp_rnd_t rnd_mode);     // use gmp_randinit_default() to init state, gmp_randclear() to clear
4262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#endif
4272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
4282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#if (MPFR_VERSION >= MPFR_VERSION_NUM(3,1,0))
429615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal grandom (gmp_randstate_t& state, mp_rnd_t rnd_mode);     // use gmp_randinit_default() to init state, gmp_randclear() to clear
430615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal grandom (unsigned int seed);
431c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
4322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
4337faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // Uniformly distributed random number generation in [0,1] using
4347faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // Mersenne-Twister algorithm by default.
4357faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // Use parameter to setup seed, e.g.: random((unsigned)time(NULL))
4367faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // Check urandom() for more precise control.
437615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal random(unsigned int seed);
438615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray
4397faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // Splits mpreal value into fractional and integer parts.
4407faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // Returns fractional part and stores integer part in n.
4412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    friend const mpreal modf(const mpreal& v, mpreal& n);
4427faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
4437faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // Constants
4447faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // don't forget to call mpfr_free_cache() for every thread where you are using const-functions
445615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal const_log2      (mp_prec_t prec, mp_rnd_t rnd_mode);
446615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal const_pi        (mp_prec_t prec, mp_rnd_t rnd_mode);
447615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal const_euler     (mp_prec_t prec, mp_rnd_t rnd_mode);
448615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal const_catalan   (mp_prec_t prec, mp_rnd_t rnd_mode);
4497faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
4507faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // returns +inf iff sign>=0 otherwise -inf
451615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal const_infinity(int sign, mp_prec_t prec);
4527faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
4537faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // Output/ Input
4547faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    friend std::ostream& operator<<(std::ostream& os, const mpreal& v);
455c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    friend std::istream& operator>>(std::istream& is, mpreal& v);
456c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
4577faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // Integer Related Functions
458615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal rint (const mpreal& v, mp_rnd_t rnd_mode);
4597faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    friend const mpreal ceil (const mpreal& v);
4607faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    friend const mpreal floor(const mpreal& v);
4617faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    friend const mpreal round(const mpreal& v);
4627faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    friend const mpreal trunc(const mpreal& v);
463615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal rint_ceil   (const mpreal& v, mp_rnd_t rnd_mode);
464615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal rint_floor  (const mpreal& v, mp_rnd_t rnd_mode);
465615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal rint_round  (const mpreal& v, mp_rnd_t rnd_mode);
466615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal rint_trunc  (const mpreal& v, mp_rnd_t rnd_mode);
467615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal frac        (const mpreal& v, mp_rnd_t rnd_mode);
468615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal remainder   (         const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode);
469615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal remquo      (long* q, const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode);
4702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
4717faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // Miscellaneous Functions
4727faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    friend const mpreal nexttoward (const mpreal& x, const mpreal& y);
4737faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    friend const mpreal nextabove  (const mpreal& x);
4747faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    friend const mpreal nextbelow  (const mpreal& x);
4757faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
4767faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // use gmp_randinit_default() to init state, gmp_randclear() to clear
4772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    friend const mpreal urandomb (gmp_randstate_t& state);
478c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
479c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// MPFR < 2.4.2 Specifics
480c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if (MPFR_VERSION <= MPFR_VERSION_NUM(2,4,2))
4817faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    friend const mpreal random2 (mp_size_t size, mp_exp_t exp);
482c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
483c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
4847faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // Instance Checkers
4852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    friend bool (isnan)    (const mpreal& v);
4862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    friend bool (isinf)    (const mpreal& v);
4872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    friend bool (isfinite) (const mpreal& v);
488c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
4897faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    friend bool isnum    (const mpreal& v);
4907faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    friend bool iszero   (const mpreal& v);
4917faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    friend bool isint    (const mpreal& v);
492c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
4937faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#if (MPFR_VERSION >= MPFR_VERSION_NUM(3,0,0))
4947faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    friend bool isregular(const mpreal& v);
495c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
496c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
4977faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // Set/Get instance properties
4987faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    inline mp_prec_t    get_prec() const;
4997faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    inline void         set_prec(mp_prec_t prec, mp_rnd_t rnd_mode = get_default_rnd());    // Change precision with rounding mode
5007faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
5017faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // Aliases for get_prec(), set_prec() - needed for compatibility with std::complex<mpreal> interface
5027faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    inline mpreal&      setPrecision(int Precision, mp_rnd_t RoundingMode = get_default_rnd());
5037faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    inline int          getPrecision() const;
5042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
5057faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // Set mpreal to +/- inf, NaN, +/-0
5062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpreal&        setInf  (int Sign = +1);
5077faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal&        setNan  ();
5087faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal&        setZero (int Sign = +1);
5097faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal&        setSign (int Sign, mp_rnd_t RoundingMode = get_default_rnd());
5107faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
5117faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    //Exponent
5127faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mp_exp_t get_exp();
5137faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    int set_exp(mp_exp_t e);
5147faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    int check_range  (int t, mp_rnd_t rnd_mode = get_default_rnd());
5152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    int subnormalize (int t, mp_rnd_t rnd_mode = get_default_rnd());
5167faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
5177faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // Inexact conversion from float
5187faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    inline bool fits_in_bits(double x, int n);
5197faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
5207faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // Set/Get global properties
5217faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    static void            set_default_prec(mp_prec_t prec);
5227faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    static void            set_default_rnd(mp_rnd_t rnd_mode);
5237faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
5247faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    static mp_exp_t  get_emin (void);
5257faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    static mp_exp_t  get_emax (void);
5267faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    static mp_exp_t  get_emin_min (void);
5277faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    static mp_exp_t  get_emin_max (void);
5287faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    static mp_exp_t  get_emax_min (void);
5297faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    static mp_exp_t  get_emax_max (void);
5307faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    static int       set_emin (mp_exp_t exp);
5317faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    static int       set_emax (mp_exp_t exp);
5327faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
5337faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // Efficient swapping of two mpreal values - needed for std algorithms
5347faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    friend void swap(mpreal& x, mpreal& y);
5352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
536615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal fmax(const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode);
537615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    friend const mpreal fmin(const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode);
538c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
539c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathprivate:
5407faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // Human friendly Debug Preview in Visual Studio.
5417faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // Put one of these lines:
5427faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    //
543615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    // mpfr::mpreal=<DebugView>                              ; Show value only
5447faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // mpfr::mpreal=<DebugView>, <mp[0]._mpfr_prec,u>bits    ; Show value & precision
5452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    //
5467faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // at the beginning of
5477faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // [Visual Studio Installation Folder]\Common7\Packages\Debugger\autoexp.dat
5487faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_DATA
549615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray
550615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    // "Smart" resources deallocation. Checks if instance initialized before deletion.
551615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    void clear(::mpfr_ptr);
552c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
553c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
554c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
555c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Exceptions
556c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass conversion_overflow : public std::exception {
557c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathpublic:
5587faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    std::string why() { return "inexact conversion from floating point"; }
559c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
560c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
5617faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez//////////////////////////////////////////////////////////////////////////
5627faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez// Constructors & converters
5637faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez// Default constructor: creates mp number and initializes it to 0.
5642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline mpreal::mpreal()
5652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
5662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpfr_init2(mpfr_ptr(), mpreal::get_default_prec());
5672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpfr_set_zero_fast(mpfr_ptr());
5687faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
5697faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
5707faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez}
5717faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
5722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline mpreal::mpreal(const mpreal& u)
5737faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez{
574615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_init2(mpfr_ptr(),mpfr_get_prec(u.mpfr_srcptr()));
575615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_set  (mpfr_ptr(),u.mpfr_srcptr(),mpreal::get_default_rnd());
576615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray
577615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    MPREAL_MSVC_DEBUGVIEW_CODE;
578615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray}
579615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray
580615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray#ifdef MPREAL_HAVE_MOVE_SUPPORT
581615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline mpreal::mpreal(mpreal&& other)
582615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray{
5832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpfr_set_uninitialized(mpfr_ptr());     // make sure "other" holds no pointer to actual data
584615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_swap(mpfr_ptr(), other.mpfr_ptr());
585615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray
586615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    MPREAL_MSVC_DEBUGVIEW_CODE;
587615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray}
588615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray
589615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline mpreal& mpreal::operator=(mpreal&& other)
590615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray{
591615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_swap(mpfr_ptr(), other.mpfr_ptr());
5927faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
5937faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
594615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    return *this;
5957faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez}
596615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray#endif
5977faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
598615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline mpreal::mpreal(const mpfr_t  u, bool shared)
5997faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez{
600615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    if(shared)
601615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    {
602615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray        std::memcpy(mpfr_ptr(), u, sizeof(mpfr_t));
603615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    }
604615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    else
605615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    {
606615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray        mpfr_init2(mpfr_ptr(), mpfr_get_prec(u));
607615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray        mpfr_set  (mpfr_ptr(), u, mpreal::get_default_rnd());
608615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    }
6097faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
6107faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
6117faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez}
6127faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
6137faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezinline mpreal::mpreal(const mpf_t u)
6147faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez{
615615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_init2(mpfr_ptr(),(mp_prec_t) mpf_get_prec(u)); // (gmp: mp_bitcnt_t) unsigned long -> long (mpfr: mp_prec_t)
616615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_set_f(mpfr_ptr(),u,mpreal::get_default_rnd());
6177faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
6187faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
6197faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez}
6207faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
6217faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezinline mpreal::mpreal(const mpz_t u, mp_prec_t prec, mp_rnd_t mode)
6227faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez{
623615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_init2(mpfr_ptr(), prec);
624615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_set_z(mpfr_ptr(), u, mode);
6257faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
6267faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
6277faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez}
6287faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
6297faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezinline mpreal::mpreal(const mpq_t u, mp_prec_t prec, mp_rnd_t mode)
6307faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez{
631615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_init2(mpfr_ptr(), prec);
632615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_set_q(mpfr_ptr(), u, mode);
6337faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
6347faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
6357faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez}
6367faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
6377faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezinline mpreal::mpreal(const double u, mp_prec_t prec, mp_rnd_t mode)
6387faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez{
639615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray     mpfr_init2(mpfr_ptr(), prec);
6407faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
6417faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#if (MPREAL_DOUBLE_BITS_OVERFLOW > -1)
642615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray  if(fits_in_bits(u, MPREAL_DOUBLE_BITS_OVERFLOW))
643615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray  {
644615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_set_d(mpfr_ptr(), u, mode);
645615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray  }else
646615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    throw conversion_overflow();
6477faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#else
648615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray  mpfr_set_d(mpfr_ptr(), u, mode);
6497faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#endif
6507faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
6517faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
6527faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez}
6537faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
6547faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezinline mpreal::mpreal(const long double u, mp_prec_t prec, mp_rnd_t mode)
6552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
656615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_init2 (mpfr_ptr(), prec);
657615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_set_ld(mpfr_ptr(), u, mode);
6587faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
6597faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
6607faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez}
6617faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
6622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline mpreal::mpreal(const unsigned long long int u, mp_prec_t prec, mp_rnd_t mode)
6632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
664615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_init2 (mpfr_ptr(), prec);
6652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpfr_set_uj(mpfr_ptr(), u, mode);
6667faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
6677faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
6687faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez}
6697faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
6702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline mpreal::mpreal(const long long int u, mp_prec_t prec, mp_rnd_t mode)
6712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
672615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_init2 (mpfr_ptr(), prec);
6732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpfr_set_sj(mpfr_ptr(), u, mode);
6747faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
6757faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
6767faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez}
6777faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
6782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline mpreal::mpreal(const unsigned long int u, mp_prec_t prec, mp_rnd_t mode)
6792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
680615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_init2 (mpfr_ptr(), prec);
6812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpfr_set_ui(mpfr_ptr(), u, mode);
6827faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
6837faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
6847faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez}
6857faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
6862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline mpreal::mpreal(const unsigned int u, mp_prec_t prec, mp_rnd_t mode)
6872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
688615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_init2 (mpfr_ptr(), prec);
6892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpfr_set_ui(mpfr_ptr(), u, mode);
6907faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
6917faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
6927faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez}
6937faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
6942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline mpreal::mpreal(const long int u, mp_prec_t prec, mp_rnd_t mode)
6957faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez{
696615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_init2 (mpfr_ptr(), prec);
6972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpfr_set_si(mpfr_ptr(), u, mode);
6987faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
6997faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
7007faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez}
7017faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
7022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline mpreal::mpreal(const int u, mp_prec_t prec, mp_rnd_t mode)
7037faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez{
704615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_init2 (mpfr_ptr(), prec);
7052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpfr_set_si(mpfr_ptr(), u, mode);
7067faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
7077faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
7087faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez}
7097faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
7107faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezinline mpreal::mpreal(const char* s, mp_prec_t prec, int base, mp_rnd_t mode)
7117faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez{
712615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_init2  (mpfr_ptr(), prec);
7132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpfr_set_str(mpfr_ptr(), s, base, mode);
7147faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
7157faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
7167faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez}
7177faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
7187faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezinline mpreal::mpreal(const std::string& s, mp_prec_t prec, int base, mp_rnd_t mode)
7197faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez{
720615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_init2  (mpfr_ptr(), prec);
7212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpfr_set_str(mpfr_ptr(), s.c_str(), base, mode);
7227faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
7237faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
7247faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez}
7257faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
726615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline void mpreal::clear(::mpfr_ptr x)
727615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray{
728615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray#ifdef MPREAL_HAVE_MOVE_SUPPORT
7292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    if(mpfr_is_initialized(x))
730615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray#endif
731615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_clear(x);
732615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray}
733615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray
7342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline mpreal::~mpreal()
7352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
736615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    clear(mpfr_ptr());
7372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}
7387faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
7397faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez// internal namespace needed for template magic
740c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal{
741c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
7427faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // Use SFINAE to restrict arithmetic operations instantiation only for numeric types
7437faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // This is needed for smooth integration with libraries based on expression templates, like Eigen.
7447faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // TODO: Do the same for boolean operators.
7452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename ArgumentType> struct result_type {};
7462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
7472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <> struct result_type<mpreal>              {typedef mpreal type;};
7482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <> struct result_type<mpz_t>               {typedef mpreal type;};
7492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <> struct result_type<mpq_t>               {typedef mpreal type;};
7502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <> struct result_type<long double>         {typedef mpreal type;};
7512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <> struct result_type<double>              {typedef mpreal type;};
7522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <> struct result_type<unsigned long int>   {typedef mpreal type;};
7532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <> struct result_type<unsigned int>        {typedef mpreal type;};
7542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <> struct result_type<long int>            {typedef mpreal type;};
7552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <> struct result_type<int>                 {typedef mpreal type;};
7562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <> struct result_type<long long>           {typedef mpreal type;};
7572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <> struct result_type<unsigned long long>  {typedef mpreal type;};
758c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
759c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
760c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// + Addition
7612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename Rhs>
7622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline const typename internal::result_type<Rhs>::type
7637faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    operator+(const mpreal& lhs, const Rhs& rhs){ return mpreal(lhs) += rhs;    }
764c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
7652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename Lhs>
7662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline const typename internal::result_type<Lhs>::type
7672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    operator+(const Lhs& lhs, const mpreal& rhs){ return mpreal(rhs) += lhs;    }
768c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
769c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// - Subtraction
7702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename Rhs>
7712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline const typename internal::result_type<Rhs>::type
7727faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    operator-(const mpreal& lhs, const Rhs& rhs){ return mpreal(lhs) -= rhs;    }
773c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
7742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename Lhs>
7752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline const typename internal::result_type<Lhs>::type
7767faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    operator-(const Lhs& lhs, const mpreal& rhs){ return mpreal(lhs) -= rhs;    }
777c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
778c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// * Multiplication
7792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename Rhs>
7802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline const typename internal::result_type<Rhs>::type
7817faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    operator*(const mpreal& lhs, const Rhs& rhs){ return mpreal(lhs) *= rhs;    }
782c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
7832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename Lhs>
7842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline const typename internal::result_type<Lhs>::type
7852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    operator*(const Lhs& lhs, const mpreal& rhs){ return mpreal(rhs) *= lhs;    }
786c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
787c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// / Division
7882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename Rhs>
7892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline const typename internal::result_type<Rhs>::type
7907faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    operator/(const mpreal& lhs, const Rhs& rhs){ return mpreal(lhs) /= rhs;    }
791c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
7922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename Lhs>
7932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline const typename internal::result_type<Lhs>::type
7947faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    operator/(const Lhs& lhs, const mpreal& rhs){ return mpreal(lhs) /= rhs;    }
795c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
796c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
797c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// sqrt
7987faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezconst mpreal sqrt(const unsigned int v, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
7997faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezconst mpreal sqrt(const long int v, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
8007faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezconst mpreal sqrt(const int v, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
8017faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezconst mpreal sqrt(const long double v, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
8027faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezconst mpreal sqrt(const double v, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
803c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
804615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray// abs
805615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal abs(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd());
806615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray
807c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
808c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// pow
8097faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezconst mpreal pow(const mpreal& a, const unsigned int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
8107faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezconst mpreal pow(const mpreal& a, const int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
8117faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezconst mpreal pow(const mpreal& a, const long double b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
8127faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezconst mpreal pow(const mpreal& a, const double b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
8137faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
8147faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezconst mpreal pow(const unsigned int a, const mpreal& b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
8157faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezconst mpreal pow(const long int a, const mpreal& b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
8167faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezconst mpreal pow(const int a, const mpreal& b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
8177faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezconst mpreal pow(const long double a, const mpreal& b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
8187faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezconst mpreal pow(const double a, const mpreal& b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
8197faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
8207faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezconst mpreal pow(const unsigned long int a, const unsigned int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
8217faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezconst mpreal pow(const unsigned long int a, const long int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
8227faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezconst mpreal pow(const unsigned long int a, const int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
8237faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezconst mpreal pow(const unsigned long int a, const long double b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
8247faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezconst mpreal pow(const unsigned long int a, const double b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
8257faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
8267faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezconst mpreal pow(const unsigned int a, const unsigned long int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
8277faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezconst mpreal pow(const unsigned int a, const unsigned int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
8287faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezconst mpreal pow(const unsigned int a, const long int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
8297faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezconst mpreal pow(const unsigned int a, const int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
8307faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezconst mpreal pow(const unsigned int a, const long double b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
8317faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezconst mpreal pow(const unsigned int a, const double b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
8327faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
8337faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezconst mpreal pow(const long int a, const unsigned long int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
8347faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezconst mpreal pow(const long int a, const unsigned int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
8357faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezconst mpreal pow(const long int a, const long int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
8367faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezconst mpreal pow(const long int a, const int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
8377faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezconst mpreal pow(const long int a, const long double b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
8387faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezconst mpreal pow(const long int a, const double b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
8397faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
8407faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezconst mpreal pow(const int a, const unsigned long int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
8417faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezconst mpreal pow(const int a, const unsigned int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
8427faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezconst mpreal pow(const int a, const long int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
8432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangconst mpreal pow(const int a, const int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
8447faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezconst mpreal pow(const int a, const long double b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
8452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangconst mpreal pow(const int a, const double b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
8467faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
8472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangconst mpreal pow(const long double a, const long double b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
8487faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezconst mpreal pow(const long double a, const unsigned long int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
8497faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezconst mpreal pow(const long double a, const unsigned int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
8507faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezconst mpreal pow(const long double a, const long int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
8517faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezconst mpreal pow(const long double a, const int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
8527faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
8532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangconst mpreal pow(const double a, const double b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
8547faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezconst mpreal pow(const double a, const unsigned long int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
8557faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezconst mpreal pow(const double a, const unsigned int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
8567faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezconst mpreal pow(const double a, const long int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
8577faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezconst mpreal pow(const double a, const int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
858c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
859615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal mul_2ui(const mpreal& v, unsigned long int k, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
860615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal mul_2si(const mpreal& v, long int k, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
861615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal div_2ui(const mpreal& v, unsigned long int k, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
862615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal div_2si(const mpreal& v, long int k, mp_rnd_t rnd_mode = mpreal::get_default_rnd());
863615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray
864c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
865c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Estimate machine epsilon for the given precision
866c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Returns smallest eps such that 1.0 + eps != 1.0
8677faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezinline mpreal machine_epsilon(mp_prec_t prec = mpreal::get_default_prec());
868c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
8697faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez// Returns smallest eps such that x + eps != x (relative machine epsilon)
8702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline mpreal machine_epsilon(const mpreal& x);
871c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
8722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Gives max & min values for the required precision,
8737faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez// minval is 'safe' meaning 1 / minval does not overflow
8747faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez// maxval is 'safe' meaning 1 / maxval does not underflow
8757faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezinline mpreal minval(mp_prec_t prec = mpreal::get_default_prec());
8767faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezinline mpreal maxval(mp_prec_t prec = mpreal::get_default_prec());
8777faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
8787faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez// 'Dirty' equality check 1: |a-b| < min{|a|,|b|} * eps
879c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline bool isEqualFuzzy(const mpreal& a, const mpreal& b, const mpreal& eps);
8807faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
8817faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez// 'Dirty' equality check 2: |a-b| < min{|a|,|b|} * eps( min{|a|,|b|} )
8827faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezinline bool isEqualFuzzy(const mpreal& a, const mpreal& b);
8837faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
8847faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez// 'Bitwise' equality check
8852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang//  maxUlps - a and b can be apart by maxUlps binary numbers.
886c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline bool isEqualUlps(const mpreal& a, const mpreal& b, int maxUlps);
887c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
888c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
8892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Convert precision in 'bits' to decimal digits and vice versa.
8902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang//    bits   = ceil(digits*log[2](10))
8912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang//    digits = floor(bits*log[10](2))
892c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
893c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mp_prec_t digits2bits(int d);
8947faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezinline int       bits2digits(mp_prec_t b);
895c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
896c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
897c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// min, max
898c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal (max)(const mpreal& x, const mpreal& y);
899c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal (min)(const mpreal& x, const mpreal& y);
900c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
901c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
902c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Implementation
903c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
904c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
905c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
906c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Operators - Assignment
907c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator=(const mpreal& v)
908c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
9097faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    if (this != &v)
9107faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    {
911615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mp_prec_t tp = mpfr_get_prec(  mpfr_srcptr());
912615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mp_prec_t vp = mpfr_get_prec(v.mpfr_srcptr());
9137faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
914615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    if(tp != vp){
915615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray      clear(mpfr_ptr());
916615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray      mpfr_init2(mpfr_ptr(), vp);
917615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    }
9187faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
919615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray        mpfr_set(mpfr_ptr(), v.mpfr_srcptr(), mpreal::get_default_rnd());
920c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
9217faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        MPREAL_MSVC_DEBUGVIEW_CODE;
9227faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    }
9237faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
924c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
925c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
926c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator=(const mpf_t v)
927c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
928615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_set_f(mpfr_ptr(), v, mpreal::get_default_rnd());
9292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
9307faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
9317faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
932c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
933c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
934c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator=(const mpz_t v)
935c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
936615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_set_z(mpfr_ptr(), v, mpreal::get_default_rnd());
9372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
9387faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
9397faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
940c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
941c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
942c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator=(const mpq_t v)
943c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
944615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_set_q(mpfr_ptr(), v, mpreal::get_default_rnd());
945c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
9467faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
9477faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
948c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
949c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
9502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline mpreal& mpreal::operator=(const long double v)
9512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
952615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_set_ld(mpfr_ptr(), v, mpreal::get_default_rnd());
9537faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
9547faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
9557faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
9567faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez}
9577faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
9582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline mpreal& mpreal::operator=(const double v)
9592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
9607faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#if (MPREAL_DOUBLE_BITS_OVERFLOW > -1)
961615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray  if(fits_in_bits(v, MPREAL_DOUBLE_BITS_OVERFLOW))
962615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray  {
963615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_set_d(mpfr_ptr(),v,mpreal::get_default_rnd());
964615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray  }else
965615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    throw conversion_overflow();
9667faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#else
967615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray  mpfr_set_d(mpfr_ptr(),v,mpreal::get_default_rnd());
9687faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#endif
969c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
970615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray  MPREAL_MSVC_DEBUGVIEW_CODE;
9717faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
972c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
973c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
9742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline mpreal& mpreal::operator=(const unsigned long int v)
9752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
9762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpfr_set_ui(mpfr_ptr(), v, mpreal::get_default_rnd());
9772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
9782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    MPREAL_MSVC_DEBUGVIEW_CODE;
9792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return *this;
9802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}
9812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
9822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline mpreal& mpreal::operator=(const unsigned int v)
9832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
9842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpfr_set_ui(mpfr_ptr(), v, mpreal::get_default_rnd());
9852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
9862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    MPREAL_MSVC_DEBUGVIEW_CODE;
9872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return *this;
9882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}
9892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
9902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline mpreal& mpreal::operator=(const unsigned long long int v)
9912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
9922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpfr_set_uj(mpfr_ptr(), v, mpreal::get_default_rnd());
993c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
9947faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
9957faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
9967faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez}
997c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
9982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline mpreal& mpreal::operator=(const long long int v)
9992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
10002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpfr_set_sj(mpfr_ptr(), v, mpreal::get_default_rnd());
10017faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
10027faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
10037faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1004c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1005c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
10062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline mpreal& mpreal::operator=(const long int v)
10072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
10082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpfr_set_si(mpfr_ptr(), v, mpreal::get_default_rnd());
1009c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
10107faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
10117faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1012c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1013c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
10147faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezinline mpreal& mpreal::operator=(const int v)
10152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
10162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpfr_set_si(mpfr_ptr(), v, mpreal::get_default_rnd());
1017c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
10187faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
10197faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1020c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1021c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
10227faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezinline mpreal& mpreal::operator=(const char* s)
10237faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez{
10247faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // Use other converters for more precise control on base & precision & rounding:
10257faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    //
10267faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    //        mpreal(const char* s,        mp_prec_t prec, int base, mp_rnd_t mode)
10277faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    //        mpreal(const std::string& s,mp_prec_t prec, int base, mp_rnd_t mode)
10287faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    //
10297faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // Here we assume base = 10 and we use precision of target variable.
1030c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
10317faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpfr_t t;
10327faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1033615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_init2(t, mpfr_get_prec(mpfr_srcptr()));
10347faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
10357faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    if(0 == mpfr_set_str(t, s, 10, mpreal::get_default_rnd()))
10367faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    {
10372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        mpfr_set(mpfr_ptr(), t, mpreal::get_default_rnd());
10387faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        MPREAL_MSVC_DEBUGVIEW_CODE;
10397faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    }
10407faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1041615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    clear(t);
10427faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1043c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1044c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
10457faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezinline mpreal& mpreal::operator=(const std::string& s)
10467faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez{
10477faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // Use other converters for more precise control on base & precision & rounding:
10487faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    //
10497faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    //        mpreal(const char* s,        mp_prec_t prec, int base, mp_rnd_t mode)
10507faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    //        mpreal(const std::string& s,mp_prec_t prec, int base, mp_rnd_t mode)
10517faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    //
10527faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // Here we assume base = 10 and we use precision of target variable.
1053c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
10547faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpfr_t t;
10557faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1056615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_init2(t, mpfr_get_prec(mpfr_srcptr()));
10577faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
10587faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    if(0 == mpfr_set_str(t, s.c_str(), 10, mpreal::get_default_rnd()))
10597faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    {
10602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        mpfr_set(mpfr_ptr(), t, mpreal::get_default_rnd());
10617faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        MPREAL_MSVC_DEBUGVIEW_CODE;
10627faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    }
10637faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1064615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    clear(t);
10657faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1066c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1067c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
10682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <typename real_t>
10692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline mpreal& mpreal::operator= (const std::complex<real_t>& z)
10702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
10712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return *this = z.real();
10722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}
10737faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1074c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
1075c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// + Addition
1076c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator+=(const mpreal& v)
1077c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1078615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_add(mpfr_ptr(), mpfr_srcptr(), v.mpfr_srcptr(), mpreal::get_default_rnd());
10797faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
10807faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1081c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1082c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1083c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator+=(const mpf_t u)
1084c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
10857faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    *this += mpreal(u);
10867faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
10877faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1088c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1089c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1090c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator+=(const mpz_t u)
1091c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1092615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_add_z(mpfr_ptr(),mpfr_srcptr(),u,mpreal::get_default_rnd());
10937faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
10947faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1095c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1096c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1097c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator+=(const mpq_t u)
1098c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1099615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_add_q(mpfr_ptr(),mpfr_srcptr(),u,mpreal::get_default_rnd());
11007faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
11017faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator+= (const long double u)
1105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
11062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    *this += mpreal(u);
11077faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
11082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return *this;
1109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator+= (const double u)
1112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0))
1114615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_add_d(mpfr_ptr(),mpfr_srcptr(),u,mpreal::get_default_rnd());
1115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#else
11167faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    *this += mpreal(u);
1117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
1118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
11197faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
11207faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator+=(const unsigned long int u)
1124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1125615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_add_ui(mpfr_ptr(),mpfr_srcptr(),u,mpreal::get_default_rnd());
11267faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
11277faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator+=(const unsigned int u)
1131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1132615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_add_ui(mpfr_ptr(),mpfr_srcptr(),u,mpreal::get_default_rnd());
11337faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
11347faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator+=(const long int u)
1138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1139615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_add_si(mpfr_ptr(),mpfr_srcptr(),u,mpreal::get_default_rnd());
11407faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
11417faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator+=(const int u)
1145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1146615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_add_si(mpfr_ptr(),mpfr_srcptr(),u,mpreal::get_default_rnd());
11477faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
11487faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
11512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline mpreal& mpreal::operator+=(const long long int u)         {    *this += mpreal(u); MPREAL_MSVC_DEBUGVIEW_CODE; return *this;    }
11522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline mpreal& mpreal::operator+=(const unsigned long long int u){    *this += mpreal(u); MPREAL_MSVC_DEBUGVIEW_CODE; return *this;    }
11532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline mpreal& mpreal::operator-=(const long long int  u)        {    *this -= mpreal(u); MPREAL_MSVC_DEBUGVIEW_CODE; return *this;    }
11542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline mpreal& mpreal::operator-=(const unsigned long long int u){    *this -= mpreal(u); MPREAL_MSVC_DEBUGVIEW_CODE; return *this;    }
11552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline mpreal& mpreal::operator*=(const long long int  u)        {    *this *= mpreal(u); MPREAL_MSVC_DEBUGVIEW_CODE; return *this;    }
11562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline mpreal& mpreal::operator*=(const unsigned long long int u){    *this *= mpreal(u); MPREAL_MSVC_DEBUGVIEW_CODE; return *this;    }
11572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline mpreal& mpreal::operator/=(const long long int  u)        {    *this /= mpreal(u); MPREAL_MSVC_DEBUGVIEW_CODE; return *this;    }
11582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline mpreal& mpreal::operator/=(const unsigned long long int u){    *this /= mpreal(u); MPREAL_MSVC_DEBUGVIEW_CODE; return *this;    }
1159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
11607faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezinline const mpreal mpreal::operator+()const    {    return mpreal(*this); }
1161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal operator+(const mpreal& a, const mpreal& b)
1163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1164615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray  mpreal c(0, (std::max)(mpfr_get_prec(a.mpfr_ptr()), mpfr_get_prec(b.mpfr_ptr())));
1165615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray  mpfr_add(c.mpfr_ptr(), a.mpfr_srcptr(), b.mpfr_srcptr(), mpreal::get_default_rnd());
1166615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray  return c;
1167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
11692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline mpreal& mpreal::operator++()
1170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
11717faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this += 1;
1172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal mpreal::operator++ (int)
1175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
11767faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal x(*this);
11777faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    *this += 1;
11787faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return x;
1179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
11812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline mpreal& mpreal::operator--()
1182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
11837faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this -= 1;
1184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal mpreal::operator-- (int)
1187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
11887faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal x(*this);
11897faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    *this -= 1;
11907faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return x;
1191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
1194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// - Subtraction
11957faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezinline mpreal& mpreal::operator-=(const mpreal& v)
1196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1197615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_sub(mpfr_ptr(),mpfr_srcptr(),v.mpfr_srcptr(),mpreal::get_default_rnd());
11987faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
11997faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator-=(const mpz_t v)
1203c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1204615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_sub_z(mpfr_ptr(),mpfr_srcptr(),v,mpreal::get_default_rnd());
12057faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
12067faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1207c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1208c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1209c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator-=(const mpq_t v)
1210c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1211615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_sub_q(mpfr_ptr(),mpfr_srcptr(),v,mpreal::get_default_rnd());
12127faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
12137faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1214c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1215c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1216c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator-=(const long double v)
1217c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
12182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    *this -= mpreal(v);
12197faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
12202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return *this;
1221c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1222c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1223c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator-=(const double v)
1224c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1225c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0))
1226615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_sub_d(mpfr_ptr(),mpfr_srcptr(),v,mpreal::get_default_rnd());
1227c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#else
12282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    *this -= mpreal(v);
1229c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
1230c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
12317faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
12327faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1233c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1234c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1235c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator-=(const unsigned long int v)
1236c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1237615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_sub_ui(mpfr_ptr(),mpfr_srcptr(),v,mpreal::get_default_rnd());
12387faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
12397faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1240c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1241c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1242c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator-=(const unsigned int v)
1243c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1244615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_sub_ui(mpfr_ptr(),mpfr_srcptr(),v,mpreal::get_default_rnd());
12457faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
12467faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1247c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1248c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1249c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator-=(const long int v)
1250c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1251615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_sub_si(mpfr_ptr(),mpfr_srcptr(),v,mpreal::get_default_rnd());
12527faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
12537faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1254c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1255c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1256c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator-=(const int v)
1257c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1258615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_sub_si(mpfr_ptr(),mpfr_srcptr(),v,mpreal::get_default_rnd());
12597faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
12607faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1261c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1262c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1263c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal mpreal::operator-()const
1264c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
12657faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal u(*this);
1266615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_neg(u.mpfr_ptr(),u.mpfr_srcptr(),mpreal::get_default_rnd());
12677faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return u;
1268c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1269c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1270c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal operator-(const mpreal& a, const mpreal& b)
1271c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1272615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray  mpreal c(0, (std::max)(mpfr_get_prec(a.mpfr_ptr()), mpfr_get_prec(b.mpfr_ptr())));
1273615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray  mpfr_sub(c.mpfr_ptr(), a.mpfr_srcptr(), b.mpfr_srcptr(), mpreal::get_default_rnd());
1274615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray  return c;
1275c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1276c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1277c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal operator-(const double  b, const mpreal& a)
1278c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1279c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0))
12807faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal x(0, mpfr_get_prec(a.mpfr_ptr()));
12817faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpfr_d_sub(x.mpfr_ptr(), b, a.mpfr_srcptr(), mpreal::get_default_rnd());
12827faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return x;
1283c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#else
12847faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal x(b, mpfr_get_prec(a.mpfr_ptr()));
12857faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    x -= a;
12867faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return x;
1287c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
1288c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1289c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1290c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal operator-(const unsigned long int b, const mpreal& a)
1291c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
12927faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal x(0, mpfr_get_prec(a.mpfr_ptr()));
12937faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpfr_ui_sub(x.mpfr_ptr(), b, a.mpfr_srcptr(), mpreal::get_default_rnd());
12947faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return x;
1295c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1296c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1297c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal operator-(const unsigned int b, const mpreal& a)
1298c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
12997faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal x(0, mpfr_get_prec(a.mpfr_ptr()));
13007faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpfr_ui_sub(x.mpfr_ptr(), b, a.mpfr_srcptr(), mpreal::get_default_rnd());
13017faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return x;
1302c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1303c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1304c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal operator-(const long int b, const mpreal& a)
1305c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
13067faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal x(0, mpfr_get_prec(a.mpfr_ptr()));
13077faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpfr_si_sub(x.mpfr_ptr(), b, a.mpfr_srcptr(), mpreal::get_default_rnd());
13087faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return x;
1309c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1310c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1311c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal operator-(const int b, const mpreal& a)
1312c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
13137faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal x(0, mpfr_get_prec(a.mpfr_ptr()));
13147faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpfr_si_sub(x.mpfr_ptr(), b, a.mpfr_srcptr(), mpreal::get_default_rnd());
13157faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return x;
1316c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1317c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1318c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
1319c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// * Multiplication
1320c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator*= (const mpreal& v)
1321c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1322615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_mul(mpfr_ptr(),mpfr_srcptr(),v.mpfr_srcptr(),mpreal::get_default_rnd());
13237faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
13247faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1325c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1326c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1327c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator*=(const mpz_t v)
1328c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1329615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_mul_z(mpfr_ptr(),mpfr_srcptr(),v,mpreal::get_default_rnd());
13307faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
13317faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1332c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1333c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1334c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator*=(const mpq_t v)
1335c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1336615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_mul_q(mpfr_ptr(),mpfr_srcptr(),v,mpreal::get_default_rnd());
13377faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
13387faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1339c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1340c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1341c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator*=(const long double v)
1342c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
13432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    *this *= mpreal(v);
13447faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
13452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return *this;
1346c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1347c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1348c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator*=(const double v)
1349c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1350c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0))
1351615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_mul_d(mpfr_ptr(),mpfr_srcptr(),v,mpreal::get_default_rnd());
1352c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#else
13532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    *this *= mpreal(v);
1354c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
13557faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
13567faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1357c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1358c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1359c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator*=(const unsigned long int v)
1360c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1361615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_mul_ui(mpfr_ptr(),mpfr_srcptr(),v,mpreal::get_default_rnd());
13627faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
13637faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1364c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1365c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1366c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator*=(const unsigned int v)
1367c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1368615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_mul_ui(mpfr_ptr(),mpfr_srcptr(),v,mpreal::get_default_rnd());
13697faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
13707faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1371c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1372c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1373c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator*=(const long int v)
1374c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1375615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_mul_si(mpfr_ptr(),mpfr_srcptr(),v,mpreal::get_default_rnd());
13767faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
13777faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1378c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1379c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1380c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator*=(const int v)
1381c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1382615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_mul_si(mpfr_ptr(),mpfr_srcptr(),v,mpreal::get_default_rnd());
13837faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
13847faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1385c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1386c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1387c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal operator*(const mpreal& a, const mpreal& b)
1388c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1389615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray  mpreal c(0, (std::max)(mpfr_get_prec(a.mpfr_ptr()), mpfr_get_prec(b.mpfr_ptr())));
1390615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray  mpfr_mul(c.mpfr_ptr(), a.mpfr_srcptr(), b.mpfr_srcptr(), mpreal::get_default_rnd());
1391615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray  return c;
1392c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1393c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1394c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
1395c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// / Division
1396c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator/=(const mpreal& v)
1397c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1398615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_div(mpfr_ptr(),mpfr_srcptr(),v.mpfr_srcptr(),mpreal::get_default_rnd());
13997faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
14007faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1401c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1402c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1403c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator/=(const mpz_t v)
1404c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1405615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_div_z(mpfr_ptr(),mpfr_srcptr(),v,mpreal::get_default_rnd());
14067faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
14077faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1408c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1409c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1410c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator/=(const mpq_t v)
1411c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1412615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_div_q(mpfr_ptr(),mpfr_srcptr(),v,mpreal::get_default_rnd());
14137faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
14147faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1415c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1416c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1417c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator/=(const long double v)
1418c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
14197faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    *this /= mpreal(v);
14207faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
14212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return *this;
1422c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1423c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1424c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator/=(const double v)
1425c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1426c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0))
1427615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_div_d(mpfr_ptr(),mpfr_srcptr(),v,mpreal::get_default_rnd());
1428c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#else
14292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    *this /= mpreal(v);
1430c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
14317faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
14327faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1433c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1434c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1435c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator/=(const unsigned long int v)
1436c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1437615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_div_ui(mpfr_ptr(),mpfr_srcptr(),v,mpreal::get_default_rnd());
14387faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
14397faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1440c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1441c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1442c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator/=(const unsigned int v)
1443c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1444615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_div_ui(mpfr_ptr(),mpfr_srcptr(),v,mpreal::get_default_rnd());
14457faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
14467faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1447c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1448c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1449c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator/=(const long int v)
1450c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1451615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_div_si(mpfr_ptr(),mpfr_srcptr(),v,mpreal::get_default_rnd());
14527faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
14537faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1454c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1455c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1456c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator/=(const int v)
1457c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1458615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_div_si(mpfr_ptr(),mpfr_srcptr(),v,mpreal::get_default_rnd());
14597faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
14607faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1461c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1462c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1463c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal operator/(const mpreal& a, const mpreal& b)
1464c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1465615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray  mpreal c(0, (std::max)(mpfr_get_prec(a.mpfr_srcptr()), mpfr_get_prec(b.mpfr_srcptr())));
1466615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray  mpfr_div(c.mpfr_ptr(), a.mpfr_srcptr(), b.mpfr_srcptr(), mpreal::get_default_rnd());
1467615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray  return c;
1468c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1469c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1470c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal operator/(const unsigned long int b, const mpreal& a)
1471c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1472615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpreal x(0, mpfr_get_prec(a.mpfr_srcptr()));
14737faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpfr_ui_div(x.mpfr_ptr(), b, a.mpfr_srcptr(), mpreal::get_default_rnd());
14747faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return x;
1475c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1476c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1477c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal operator/(const unsigned int b, const mpreal& a)
1478c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1479615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpreal x(0, mpfr_get_prec(a.mpfr_srcptr()));
14807faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpfr_ui_div(x.mpfr_ptr(), b, a.mpfr_srcptr(), mpreal::get_default_rnd());
14817faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return x;
1482c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1483c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1484c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal operator/(const long int b, const mpreal& a)
1485c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1486615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpreal x(0, mpfr_get_prec(a.mpfr_srcptr()));
1487615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_si_div(x.mpfr_ptr(), b, a.mpfr_srcptr(), mpreal::get_default_rnd());
14887faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return x;
1489c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1490c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1491c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal operator/(const int b, const mpreal& a)
1492c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1493615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpreal x(0, mpfr_get_prec(a.mpfr_srcptr()));
1494615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_si_div(x.mpfr_ptr(), b, a.mpfr_srcptr(), mpreal::get_default_rnd());
14957faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return x;
1496c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1497c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1498c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal operator/(const double  b, const mpreal& a)
1499c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1500c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0))
1501615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpreal x(0, mpfr_get_prec(a.mpfr_srcptr()));
1502615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_d_div(x.mpfr_ptr(), b, a.mpfr_srcptr(), mpreal::get_default_rnd());
15037faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return x;
1504c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#else
15057faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal x(0, mpfr_get_prec(a.mpfr_ptr()));
15067faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    x /= a;
15077faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return x;
1508c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
1509c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1510c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1511c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
1512c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Shifts operators - Multiplication/Division by power of 2
1513c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator<<=(const unsigned long int u)
1514c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1515615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_mul_2ui(mpfr_ptr(),mpfr_srcptr(),u,mpreal::get_default_rnd());
15167faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
15177faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1518c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1519c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1520c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator<<=(const unsigned int u)
1521c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1522615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_mul_2ui(mpfr_ptr(),mpfr_srcptr(),static_cast<unsigned long int>(u),mpreal::get_default_rnd());
15237faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
15247faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1525c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1526c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1527c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator<<=(const long int u)
1528c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1529615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_mul_2si(mpfr_ptr(),mpfr_srcptr(),u,mpreal::get_default_rnd());
15307faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
15317faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1532c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1533c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1534c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator<<=(const int u)
1535c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1536615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_mul_2si(mpfr_ptr(),mpfr_srcptr(),static_cast<long int>(u),mpreal::get_default_rnd());
15377faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
15387faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1539c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1540c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1541c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator>>=(const unsigned long int u)
1542c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1543615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_div_2ui(mpfr_ptr(),mpfr_srcptr(),u,mpreal::get_default_rnd());
15447faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
15457faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1546c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1547c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1548c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator>>=(const unsigned int u)
1549c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1550615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_div_2ui(mpfr_ptr(),mpfr_srcptr(),static_cast<unsigned long int>(u),mpreal::get_default_rnd());
15517faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
15527faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1553c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1554c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1555c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator>>=(const long int u)
1556c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1557615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_div_2si(mpfr_ptr(),mpfr_srcptr(),u,mpreal::get_default_rnd());
15587faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
15597faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1560c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1561c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1562c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator>>=(const int u)
1563c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1564615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_div_2si(mpfr_ptr(),mpfr_srcptr(),static_cast<long int>(u),mpreal::get_default_rnd());
15657faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
15667faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1567c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1568c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1569c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal operator<<(const mpreal& v, const unsigned long int k)
1570c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
15717faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return mul_2ui(v,k);
1572c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1573c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1574c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal operator<<(const mpreal& v, const unsigned int k)
1575c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
15767faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return mul_2ui(v,static_cast<unsigned long int>(k));
1577c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1578c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1579c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal operator<<(const mpreal& v, const long int k)
1580c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
15817faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return mul_2si(v,k);
1582c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1583c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1584c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal operator<<(const mpreal& v, const int k)
1585c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
15867faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return mul_2si(v,static_cast<long int>(k));
1587c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1588c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1589c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal operator>>(const mpreal& v, const unsigned long int k)
1590c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
15917faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return div_2ui(v,k);
1592c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1593c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1594c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal operator>>(const mpreal& v, const long int k)
1595c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
15967faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return div_2si(v,k);
1597c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1598c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1599c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal operator>>(const mpreal& v, const unsigned int k)
1600c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
16017faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return div_2ui(v,static_cast<unsigned long int>(k));
1602c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1603c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1604c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal operator>>(const mpreal& v, const int k)
1605c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
16067faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return div_2si(v,static_cast<long int>(k));
1607c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1608c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1609c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// mul_2ui
1610c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal mul_2ui(const mpreal& v, unsigned long int k, mp_rnd_t rnd_mode)
1611c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
16127faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal x(v);
1613615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_mul_2ui(x.mpfr_ptr(),v.mpfr_srcptr(),k,rnd_mode);
16147faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return x;
1615c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1616c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1617c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// mul_2si
1618c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal mul_2si(const mpreal& v, long int k, mp_rnd_t rnd_mode)
1619c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
16207faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal x(v);
1621615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_mul_2si(x.mpfr_ptr(),v.mpfr_srcptr(),k,rnd_mode);
16227faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return x;
1623c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1624c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1625c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal div_2ui(const mpreal& v, unsigned long int k, mp_rnd_t rnd_mode)
1626c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
16277faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal x(v);
1628615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_div_2ui(x.mpfr_ptr(),v.mpfr_srcptr(),k,rnd_mode);
16297faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return x;
1630c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1631c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1632c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal div_2si(const mpreal& v, long int k, mp_rnd_t rnd_mode)
1633c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
16347faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal x(v);
1635615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_div_2si(x.mpfr_ptr(),v.mpfr_srcptr(),k,rnd_mode);
16367faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return x;
1637c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1638c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1639c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
16402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang//Relational operators
16412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
16422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// WARNING:
16432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang//
16442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Please note that following checks for double-NaN are guaranteed to work only in IEEE math mode:
16452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang//
16462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// isnan(b) =  (b != b)
16472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// isnan(b) = !(b == b)  (we use in code below)
16482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang//
16492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Be cautions if you use compiler options which break strict IEEE compliance (e.g. -ffast-math in GCC).
16502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Use std::isnan instead (C++11).
16512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
16522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool operator >  (const mpreal& a, const mpreal& b           ){  return (mpfr_greater_p(a.mpfr_srcptr(),b.mpfr_srcptr()) != 0 );            }
16532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool operator >  (const mpreal& a, const unsigned long int b ){  return !isnan EIGEN_NOT_A_MACRO (a) && (mpfr_cmp_ui(a.mpfr_srcptr(),b) > 0 );                 }
16542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool operator >  (const mpreal& a, const unsigned int b      ){  return !isnan EIGEN_NOT_A_MACRO (a) && (mpfr_cmp_ui(a.mpfr_srcptr(),b) > 0 );                 }
16552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool operator >  (const mpreal& a, const long int b          ){  return !isnan EIGEN_NOT_A_MACRO (a) && (mpfr_cmp_si(a.mpfr_srcptr(),b) > 0 );                 }
16562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool operator >  (const mpreal& a, const int b               ){  return !isnan EIGEN_NOT_A_MACRO (a) && (mpfr_cmp_si(a.mpfr_srcptr(),b) > 0 );                 }
16572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool operator >  (const mpreal& a, const long double b       ){  return !isnan EIGEN_NOT_A_MACRO (a) && (b == b) && (mpfr_cmp_ld(a.mpfr_srcptr(),b) > 0 );    }
16582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool operator >  (const mpreal& a, const double b            ){  return !isnan EIGEN_NOT_A_MACRO (a) && (b == b) && (mpfr_cmp_d (a.mpfr_srcptr(),b) > 0 );    }
16592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
16602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool operator >= (const mpreal& a, const mpreal& b           ){  return (mpfr_greaterequal_p(a.mpfr_srcptr(),b.mpfr_srcptr()) != 0 );       }
16612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool operator >= (const mpreal& a, const unsigned long int b ){  return !isnan EIGEN_NOT_A_MACRO (a) && (mpfr_cmp_ui(a.mpfr_srcptr(),b) >= 0 );                }
16622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// inline bool operator >= (const mpreal& a, const unsigned int b      ){  return !isnan EIGEN_NOT_A_MACRO (isnan()a) && (mpfr_cmp_ui(a.mpfr_srcptr(),b) >= 0 );                }
16632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool operator >= (const mpreal& a, const long int b          ){  return !isnan EIGEN_NOT_A_MACRO (a) && (mpfr_cmp_si(a.mpfr_srcptr(),b) >= 0 );                }
16642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool operator >= (const mpreal& a, const int b               ){  return !isnan EIGEN_NOT_A_MACRO (a) && (mpfr_cmp_si(a.mpfr_srcptr(),b) >= 0 );                }
16652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool operator >= (const mpreal& a, const long double b       ){  return !isnan EIGEN_NOT_A_MACRO (a) && (b == b) && (mpfr_cmp_ld(a.mpfr_srcptr(),b) >= 0 );   }
16662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool operator >= (const mpreal& a, const double b            ){  return !isnan EIGEN_NOT_A_MACRO (a) && (b == b) && (mpfr_cmp_d (a.mpfr_srcptr(),b) >= 0 );   }
16672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
16682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool operator <  (const mpreal& a, const mpreal& b           ){  return (mpfr_less_p(a.mpfr_srcptr(),b.mpfr_srcptr()) != 0 );               }
16692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool operator <  (const mpreal& a, const unsigned long int b ){  return !isnan EIGEN_NOT_A_MACRO (a) && (mpfr_cmp_ui(a.mpfr_srcptr(),b) < 0 );                 }
16702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool operator <  (const mpreal& a, const unsigned int b      ){  return !isnan EIGEN_NOT_A_MACRO (a) && (mpfr_cmp_ui(a.mpfr_srcptr(),b) < 0 );                 }
16712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool operator <  (const mpreal& a, const long int b          ){  return !isnan EIGEN_NOT_A_MACRO (a) && (mpfr_cmp_si(a.mpfr_srcptr(),b) < 0 );                 }
16722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool operator <  (const mpreal& a, const int b               ){  return !isnan EIGEN_NOT_A_MACRO (a) && (mpfr_cmp_si(a.mpfr_srcptr(),b) < 0 );                 }
16732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool operator <  (const mpreal& a, const long double b       ){  return !isnan EIGEN_NOT_A_MACRO (a) && (b == b) && (mpfr_cmp_ld(a.mpfr_srcptr(),b) < 0 );    }
16742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool operator <  (const mpreal& a, const double b            ){  return !isnan EIGEN_NOT_A_MACRO (a) && (b == b) && (mpfr_cmp_d (a.mpfr_srcptr(),b) < 0 );    }
16752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
16762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool operator <= (const mpreal& a, const mpreal& b           ){  return (mpfr_lessequal_p(a.mpfr_srcptr(),b.mpfr_srcptr()) != 0 );          }
16772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool operator <= (const mpreal& a, const unsigned long int b ){  return !isnan EIGEN_NOT_A_MACRO (a) && (mpfr_cmp_ui(a.mpfr_srcptr(),b) <= 0 );                }
16782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool operator <= (const mpreal& a, const unsigned int b      ){  return !isnan EIGEN_NOT_A_MACRO (a) && (mpfr_cmp_ui(a.mpfr_srcptr(),b) <= 0 );                }
16792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool operator <= (const mpreal& a, const long int b          ){  return !isnan EIGEN_NOT_A_MACRO (a) && (mpfr_cmp_si(a.mpfr_srcptr(),b) <= 0 );                }
16802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool operator <= (const mpreal& a, const int b               ){  return !isnan EIGEN_NOT_A_MACRO (a) && (mpfr_cmp_si(a.mpfr_srcptr(),b) <= 0 );                }
16812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool operator <= (const mpreal& a, const long double b       ){  return !isnan EIGEN_NOT_A_MACRO (a) && (b == b) && (mpfr_cmp_ld(a.mpfr_srcptr(),b) <= 0 );   }
16822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool operator <= (const mpreal& a, const double b            ){  return !isnan EIGEN_NOT_A_MACRO (a) && (b == b) && (mpfr_cmp_d (a.mpfr_srcptr(),b) <= 0 );   }
16832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
16842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool operator == (const mpreal& a, const mpreal& b           ){  return (mpfr_equal_p(a.mpfr_srcptr(),b.mpfr_srcptr()) != 0 );              }
16852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool operator == (const mpreal& a, const unsigned long int b ){  return !isnan EIGEN_NOT_A_MACRO (a) && (mpfr_cmp_ui(a.mpfr_srcptr(),b) == 0 );                }
16862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool operator == (const mpreal& a, const unsigned int b      ){  return !isnan EIGEN_NOT_A_MACRO (a) && (mpfr_cmp_ui(a.mpfr_srcptr(),b) == 0 );                }
16872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool operator == (const mpreal& a, const long int b          ){  return !isnan EIGEN_NOT_A_MACRO (a) && (mpfr_cmp_si(a.mpfr_srcptr(),b) == 0 );                }
16882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool operator == (const mpreal& a, const int b               ){  return !isnan EIGEN_NOT_A_MACRO (a) && (mpfr_cmp_si(a.mpfr_srcptr(),b) == 0 );                }
16892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool operator == (const mpreal& a, const long double b       ){  return !isnan EIGEN_NOT_A_MACRO (a) && (b == b) && (mpfr_cmp_ld(a.mpfr_srcptr(),b) == 0 );   }
16902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool operator == (const mpreal& a, const double b            ){  return !isnan EIGEN_NOT_A_MACRO (a) && (b == b) && (mpfr_cmp_d (a.mpfr_srcptr(),b) == 0 );   }
16912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
16922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool operator != (const mpreal& a, const mpreal& b           ){  return !(a == b);  }
16932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool operator != (const mpreal& a, const unsigned long int b ){  return !(a == b);  }
16942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool operator != (const mpreal& a, const unsigned int b      ){  return !(a == b);  }
16952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool operator != (const mpreal& a, const long int b          ){  return !(a == b);  }
16962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool operator != (const mpreal& a, const int b               ){  return !(a == b);  }
16972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool operator != (const mpreal& a, const long double b       ){  return !(a == b);  }
16982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool operator != (const mpreal& a, const double b            ){  return !(a == b);  }
16992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
17002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool (isnan)    (const mpreal& op){    return (mpfr_nan_p    (op.mpfr_srcptr()) != 0 );    }
17012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool (isinf)    (const mpreal& op){    return (mpfr_inf_p    (op.mpfr_srcptr()) != 0 );    }
17022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool (isfinite) (const mpreal& op){    return (mpfr_number_p (op.mpfr_srcptr()) != 0 );    }
1703615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline bool iszero   (const mpreal& op){    return (mpfr_zero_p   (op.mpfr_srcptr()) != 0 );    }
1704615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline bool isint    (const mpreal& op){    return (mpfr_integer_p(op.mpfr_srcptr()) != 0 );    }
1705c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1706c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if (MPFR_VERSION >= MPFR_VERSION_NUM(3,0,0))
1707615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline bool isregular(const mpreal& op){    return (mpfr_regular_p(op.mpfr_srcptr()));}
17082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#endif
1709c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1710c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
1711c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Type Converters
17122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool               mpreal::toBool   (             )  const    {    return  mpfr_zero_p (mpfr_srcptr()) == 0;     }
17132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline long               mpreal::toLong   (mp_rnd_t mode)  const    {    return  mpfr_get_si (mpfr_srcptr(), mode);    }
17142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline unsigned long      mpreal::toULong  (mp_rnd_t mode)  const    {    return  mpfr_get_ui (mpfr_srcptr(), mode);    }
17152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline float              mpreal::toFloat  (mp_rnd_t mode)  const    {    return  mpfr_get_flt(mpfr_srcptr(), mode);    }
17162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline double             mpreal::toDouble (mp_rnd_t mode)  const    {    return  mpfr_get_d  (mpfr_srcptr(), mode);    }
17172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline long double        mpreal::toLDouble(mp_rnd_t mode)  const    {    return  mpfr_get_ld (mpfr_srcptr(), mode);    }
17182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline long long          mpreal::toLLong  (mp_rnd_t mode)  const    {    return  mpfr_get_sj (mpfr_srcptr(), mode);    }
17192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline unsigned long long mpreal::toULLong (mp_rnd_t mode)  const    {    return  mpfr_get_uj (mpfr_srcptr(), mode);    }
17207faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
17217faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezinline ::mpfr_ptr     mpreal::mpfr_ptr()             { return mp; }
17227faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezinline ::mpfr_srcptr  mpreal::mpfr_ptr()    const    { return mp; }
17237faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezinline ::mpfr_srcptr  mpreal::mpfr_srcptr() const    { return mp; }
17247faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
17257faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandeztemplate <class T>
17267faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezinline std::string toString(T t, std::ios_base & (*f)(std::ios_base&))
17277faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez{
17287faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    std::ostringstream oss;
17297faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    oss << f << t;
17307faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return oss.str();
17317faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez}
17327faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
17337faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0))
17347faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
17357faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezinline std::string mpreal::toString(const std::string& format) const
17367faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez{
17377faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    char *s = NULL;
17387faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    std::string out;
17397faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
17407faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    if( !format.empty() )
17417faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    {
1742615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray        if(!(mpfr_asprintf(&s, format.c_str(), mpfr_srcptr()) < 0))
17437faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        {
17447faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez            out = std::string(s);
17457faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
17467faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez            mpfr_free_str(s);
17477faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        }
17487faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    }
17497faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
17507faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return out;
17517faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez}
17527faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
17537faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#endif
17547faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
17557faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezinline std::string mpreal::toString(int n, int b, mp_rnd_t mode) const
17567faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez{
1757615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    // TODO: Add extended format specification (f, e, rounding mode) as it done in output operator
17587faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    (void)b;
17597faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    (void)mode;
17607faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
17617faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0))
17627faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1763615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    std::ostringstream format;
17647faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
17652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    int digits = (n >= 0) ? n : 1 + bits2digits(mpfr_get_prec(mpfr_srcptr()));
17662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1767615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    format << "%." << digits << "RNg";
17687faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1769615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    return toString(format.str());
17707faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
17717faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#else
17727faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
17732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    char *s, *ns = NULL;
17747faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    size_t slen, nslen;
17757faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mp_exp_t exp;
17767faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    std::string out;
17777faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
17787faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    if(mpfr_inf_p(mp))
17792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    {
17807faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        if(mpfr_sgn(mp)>0) return "+Inf";
17817faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        else               return "-Inf";
17827faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    }
17837faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
17847faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    if(mpfr_zero_p(mp)) return "0";
17857faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    if(mpfr_nan_p(mp))  return "NaN";
17867faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1787615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    s  = mpfr_get_str(NULL, &exp, b, 0, mp, mode);
1788615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    ns = mpfr_get_str(NULL, &exp, b, (std::max)(0,n), mp, mode);
17897faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
17907faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    if(s!=NULL && ns!=NULL)
17917faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    {
17927faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        slen  = strlen(s);
17937faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        nslen = strlen(ns);
17942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        if(nslen<=slen)
17957faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        {
17967faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez            mpfr_free_str(s);
17977faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez            s = ns;
17987faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez            slen = nslen;
17997faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        }
18007faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        else {
18017faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez            mpfr_free_str(ns);
18027faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        }
18037faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
18047faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        // Make human eye-friendly formatting if possible
18057faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        if (exp>0 && static_cast<size_t>(exp)<slen)
18067faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        {
18077faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez            if(s[0]=='-')
18087faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez            {
18097faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                // Remove zeros starting from right end
18107faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                char* ptr = s+slen-1;
18112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                while (*ptr=='0' && ptr>s+exp) ptr--;
18127faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
18137faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                if(ptr==s+exp) out = std::string(s,exp+1);
18147faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                else           out = std::string(s,exp+1)+'.'+std::string(s+exp+1,ptr-(s+exp+1)+1);
18157faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
18167faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                //out = string(s,exp+1)+'.'+string(s+exp+1);
18177faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez            }
18187faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez            else
18197faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez            {
18207faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                // Remove zeros starting from right end
18217faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                char* ptr = s+slen-1;
18222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                while (*ptr=='0' && ptr>s+exp-1) ptr--;
18237faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
18247faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                if(ptr==s+exp-1) out = std::string(s,exp);
18257faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                else             out = std::string(s,exp)+'.'+std::string(s+exp,ptr-(s+exp)+1);
18267faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
18277faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                //out = string(s,exp)+'.'+string(s+exp);
18287faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez            }
18297faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
18307faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        }else{ // exp<0 || exp>slen
18317faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez            if(s[0]=='-')
18327faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez            {
18337faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                // Remove zeros starting from right end
18347faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                char* ptr = s+slen-1;
18352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                while (*ptr=='0' && ptr>s+1) ptr--;
18367faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
18377faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                if(ptr==s+1) out = std::string(s,2);
18387faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                else         out = std::string(s,2)+'.'+std::string(s+2,ptr-(s+2)+1);
18397faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
18407faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                //out = string(s,2)+'.'+string(s+2);
18417faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez            }
18427faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez            else
18437faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez            {
18447faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                // Remove zeros starting from right end
18457faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                char* ptr = s+slen-1;
18462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                while (*ptr=='0' && ptr>s) ptr--;
18477faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
18487faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                if(ptr==s) out = std::string(s,1);
18497faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                else       out = std::string(s,1)+'.'+std::string(s+1,ptr-(s+1)+1);
18507faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
18517faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                //out = string(s,1)+'.'+string(s+1);
18527faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez            }
18537faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
18547faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez            // Make final string
18557faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez            if(--exp)
18567faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez            {
18577faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                if(exp>0) out += "e+"+mpfr::toString<mp_exp_t>(exp,std::dec);
18587faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                else       out += "e"+mpfr::toString<mp_exp_t>(exp,std::dec);
18597faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez            }
18607faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        }
18617faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
18627faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        mpfr_free_str(s);
18637faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        return out;
18647faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    }else{
18657faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        return "conversion error!";
18667faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    }
1867c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
18687faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez}
18697faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
18707faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
18717faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez//////////////////////////////////////////////////////////////////////////
18727faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez// I/O
18732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline std::ostream& mpreal::output(std::ostream& os) const
1874615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray{
1875615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    std::ostringstream format;
1876615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    const std::ios::fmtflags flags = os.flags();
1877615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray
1878615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    format << ((flags & std::ios::showpos) ? "%+" : "%");
1879615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    if (os.precision() >= 0)
1880615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray        format << '.' << os.precision() << "R*"
1881615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray               << ((flags & std::ios::floatfield) == std::ios::fixed ? 'f' :
1882615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray                   (flags & std::ios::floatfield) == std::ios::scientific ? 'e' :
1883615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray                   'g');
1884615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    else
1885615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray        format << "R*e";
1886615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray
1887615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    char *s = NULL;
1888615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    if(!(mpfr_asprintf(&s, format.str().c_str(),
1889615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray                        mpfr::mpreal::get_default_rnd(),
1890615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray                        mpfr_srcptr())
1891615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray        < 0))
1892615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    {
1893615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray        os << std::string(s);
1894615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray        mpfr_free_str(s);
1895615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    }
1896615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    return os;
1897615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray}
1898615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray
18997faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezinline std::ostream& operator<<(std::ostream& os, const mpreal& v)
19007faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez{
1901615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    return v.output(os);
19027faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez}
1903c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
19047faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezinline std::istream& operator>>(std::istream &is, mpreal& v)
19057faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez{
1906615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    // TODO: use cout::hexfloat and other flags to setup base
19077faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    std::string tmp;
19087faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    is >> tmp;
1909615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_set_str(v.mpfr_ptr(), tmp.c_str(), 10, mpreal::get_default_rnd());
19107faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return is;
19117faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez}
1912c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1913c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
19147faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez//     Bits - decimal digits relation
19157faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez//        bits   = ceil(digits*log[2](10))
19167faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez//        digits = floor(bits*log[10](2))
1917c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1918c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mp_prec_t digits2bits(int d)
1919c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
19207faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    const double LOG2_10 = 3.3219280948873624;
1921c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1922615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    return mp_prec_t(std::ceil( d * LOG2_10 ));
1923c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1924c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1925c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline int bits2digits(mp_prec_t b)
1926c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
19277faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    const double LOG10_2 = 0.30102999566398119;
1928c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1929615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    return int(std::floor( b * LOG10_2 ));
1930c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1931c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1932c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
1933c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Set/Get number properties
1934615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline int sgn(const mpreal& op)
1935c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
19362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return mpfr_sgn(op.mpfr_srcptr());
1937c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1938c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1939c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::setSign(int sign, mp_rnd_t RoundingMode)
1940c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1941615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_setsign(mpfr_ptr(), mpfr_srcptr(), (sign < 0 ? 1 : 0), RoundingMode);
19427faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
19437faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1944c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1945c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1946c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline int mpreal::getPrecision() const
1947c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1948615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    return int(mpfr_get_prec(mpfr_srcptr()));
1949c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1950c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1951c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::setPrecision(int Precision, mp_rnd_t RoundingMode)
1952c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1953615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_prec_round(mpfr_ptr(), Precision, RoundingMode);
19547faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
19557faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1956c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1957c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
19582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline mpreal& mpreal::setInf(int sign)
19592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
1960615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_set_inf(mpfr_ptr(), sign);
19617faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
19627faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
19632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}
1964c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
19652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline mpreal& mpreal::setNan()
1966c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1967615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_set_nan(mpfr_ptr());
19687faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
19697faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1970c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1971c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
19722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline mpreal& mpreal::setZero(int sign)
1973c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
19747faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#if (MPFR_VERSION >= MPFR_VERSION_NUM(3,0,0))
1975615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_set_zero(mpfr_ptr(), sign);
19767faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#else
1977615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_set_si(mpfr_ptr(), 0, (mpfr_get_default_rounding_mode)());
19787faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    setSign(sign);
19792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#endif
19807faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
19817faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
19827faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return *this;
1983c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1984c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1985c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mp_prec_t mpreal::get_prec() const
1986c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1987615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    return mpfr_get_prec(mpfr_srcptr());
1988c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1989c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1990c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline void mpreal::set_prec(mp_prec_t prec, mp_rnd_t rnd_mode)
1991c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1992615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_prec_round(mpfr_ptr(),prec,rnd_mode);
19937faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
1994c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1995c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1996c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mp_exp_t mpreal::get_exp ()
1997c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1998615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    return mpfr_get_exp(mpfr_srcptr());
1999c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2000c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2001c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline int mpreal::set_exp (mp_exp_t e)
2002c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2003615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    int x = mpfr_set_exp(mpfr_ptr(), e);
20047faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
20057faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return x;
2006c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2007c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
20082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline const mpreal frexp(const mpreal& x, mp_exp_t* exp, mp_rnd_t mode = mpreal::get_default_rnd())
2009c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
20102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpreal y(x);
20112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#if (MPFR_VERSION >= MPFR_VERSION_NUM(3,1,0))
20122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpfr_frexp(exp,y.mpfr_ptr(),x.mpfr_srcptr(),mode);
20132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#else
20142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    *exp = mpfr_get_exp(y.mpfr_srcptr());
20152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpfr_set_exp(y.mpfr_ptr(),0);
20162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#endif
20172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return y;
2018c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2019c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2020c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal ldexp(const mpreal& v, mp_exp_t exp)
2021c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
20227faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal x(v);
2023c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
20242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // rounding is not important since we are just increasing the exponent (= exact operation)
20252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpfr_mul_2si(x.mpfr_ptr(), x.mpfr_srcptr(), exp, mpreal::get_default_rnd());
20267faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return x;
2027c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2028c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
20292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline const mpreal scalbn(const mpreal& v, mp_exp_t exp)
20302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
20312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return ldexp(v, exp);
20322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}
20332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
20347faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezinline mpreal machine_epsilon(mp_prec_t prec)
2035c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
20367faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    /* the smallest eps such that 1 + eps != 1 */
20377faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return machine_epsilon(mpreal(1, prec));
2038c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2039c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
20407faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezinline mpreal machine_epsilon(const mpreal& x)
20412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
20427faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    /* the smallest eps such that x + eps != x */
20437faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    if( x < 0)
20447faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    {
2045615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray        return nextabove(-x) + x;
20467faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    }else{
2047615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray        return nextabove( x) - x;
20487faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    }
2049c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2050c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
20517faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez// minval is 'safe' meaning 1 / minval does not overflow
20527faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezinline mpreal minval(mp_prec_t prec)
2053c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
20547faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    /* min = 1/2 * 2^emin = 2^(emin - 1) */
20557faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return mpreal(1, prec) << mpreal::get_emin()-1;
2056c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2057c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
20587faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez// maxval is 'safe' meaning 1 / maxval does not underflow
20597faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezinline mpreal maxval(mp_prec_t prec)
2060c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
20617faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    /* max = (1 - eps) * 2^emax, eps is machine epsilon */
20622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return (mpreal(1, prec) - machine_epsilon(prec)) << mpreal::get_emax();
2063c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2064c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2065c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline bool isEqualUlps(const mpreal& a, const mpreal& b, int maxUlps)
2066c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2067615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    return abs(a - b) <= machine_epsilon((max)(abs(a), abs(b))) * maxUlps;
2068c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2069c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2070c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline bool isEqualFuzzy(const mpreal& a, const mpreal& b, const mpreal& eps)
2071c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2072615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    return abs(a - b) <= eps;
2073c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2074c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2075c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline bool isEqualFuzzy(const mpreal& a, const mpreal& b)
2076c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2077615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    return isEqualFuzzy(a, b, machine_epsilon((max)(1, (min)(abs(a), abs(b)))));
2078c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2079c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
20802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang//////////////////////////////////////////////////////////////////////////
20812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// C++11 sign functions.
20822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline mpreal copysign(const mpreal& x, const  mpreal& y, mp_rnd_t rnd_mode = mpreal::get_default_rnd())
20832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
20842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpreal rop(0, mpfr_get_prec(x.mpfr_ptr()));
20852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpfr_setsign(rop.mpfr_ptr(), x.mpfr_srcptr(), mpfr_signbit(y.mpfr_srcptr()), rnd_mode);
20862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return rop;
20872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}
20882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
20892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline bool signbit(const mpreal& x)
20902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
20912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return mpfr_signbit(x.mpfr_srcptr());
20922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}
20932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2094c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal modf(const mpreal& v, mpreal& n)
2095c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2096615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpreal f(v);
2097c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
20987faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // rounding is not important since we are using the same number
20992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpfr_frac (f.mpfr_ptr(),f.mpfr_srcptr(),mpreal::get_default_rnd());
2100615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_trunc(n.mpfr_ptr(),v.mpfr_srcptr());
2101615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    return f;
2102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline int mpreal::check_range (int t, mp_rnd_t rnd_mode)
2105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2106615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    return mpfr_check_range(mpfr_ptr(),t,rnd_mode);
2107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline int mpreal::subnormalize (int t,mp_rnd_t rnd_mode)
2110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2111615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    int r = mpfr_subnormalize(mpfr_ptr(),t,rnd_mode);
21127faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    MPREAL_MSVC_DEBUGVIEW_CODE;
21137faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return r;
2114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mp_exp_t mpreal::get_emin (void)
2117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
21187faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return mpfr_get_emin();
2119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline int mpreal::set_emin (mp_exp_t exp)
2122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
21237faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return mpfr_set_emin(exp);
2124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mp_exp_t mpreal::get_emax (void)
2127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
21287faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return mpfr_get_emax();
2129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline int mpreal::set_emax (mp_exp_t exp)
2132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
21337faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return mpfr_set_emax(exp);
2134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mp_exp_t mpreal::get_emin_min (void)
2137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
21387faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return mpfr_get_emin_min();
2139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mp_exp_t mpreal::get_emin_max (void)
2142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
21437faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return mpfr_get_emin_max();
2144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mp_exp_t mpreal::get_emax_min (void)
2147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
21487faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return mpfr_get_emax_min();
2149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mp_exp_t mpreal::get_emax_max (void)
2152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
21537faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return mpfr_get_emax_max();
2154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
2157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Mathematical Functions
2158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
21597faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#define MPREAL_UNARY_MATH_FUNCTION_BODY(f)                    \
21607faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        mpreal y(0, mpfr_get_prec(x.mpfr_srcptr()));          \
21617faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        mpfr_##f(y.mpfr_ptr(), x.mpfr_srcptr(), r);           \
21622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        return y;
2163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2164615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal sqr  (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd())
2165615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray{   MPREAL_UNARY_MATH_FUNCTION_BODY(sqr );    }
2166615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray
2167615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal sqrt (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd())
2168615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray{   MPREAL_UNARY_MATH_FUNCTION_BODY(sqrt);    }
2169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
21707faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezinline const mpreal sqrt(const unsigned long int x, mp_rnd_t r)
2171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
21727faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal y;
21737faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpfr_sqrt_ui(y.mpfr_ptr(), x, r);
21747faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return y;
2175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal sqrt(const unsigned int v, mp_rnd_t rnd_mode)
2178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
21797faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return sqrt(static_cast<unsigned long int>(v),rnd_mode);
2180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal sqrt(const long int v, mp_rnd_t rnd_mode)
2183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
21847faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    if (v>=0)   return sqrt(static_cast<unsigned long int>(v),rnd_mode);
21852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    else        return mpreal().setNan(); // NaN
2186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal sqrt(const int v, mp_rnd_t rnd_mode)
2189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
21907faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    if (v>=0)   return sqrt(static_cast<unsigned long int>(v),rnd_mode);
21917faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    else        return mpreal().setNan(); // NaN
2192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2194615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal root(const mpreal& x, unsigned long int k, mp_rnd_t r = mpreal::get_default_rnd())
2195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
21962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpreal y(0, mpfr_get_prec(x.mpfr_srcptr()));
21972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpfr_root(y.mpfr_ptr(), x.mpfr_srcptr(), k, r);
21982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return y;
2199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2201615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal dim(const mpreal& a, const mpreal& b, mp_rnd_t r = mpreal::get_default_rnd())
2202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
22037faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal y(0, mpfr_get_prec(a.mpfr_srcptr()));
22047faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpfr_dim(y.mpfr_ptr(), a.mpfr_srcptr(), b.mpfr_srcptr(), r);
22057faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return y;
2206c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2207c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2208c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline int cmpabs(const mpreal& a,const mpreal& b)
2209c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2210615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    return mpfr_cmpabs(a.mpfr_ptr(), b.mpfr_srcptr());
2211c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2212c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2213615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline int sin_cos(mpreal& s, mpreal& c, const mpreal& v, mp_rnd_t rnd_mode = mpreal::get_default_rnd())
2214c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2215615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    return mpfr_sin_cos(s.mpfr_ptr(), c.mpfr_ptr(), v.mpfr_srcptr(), rnd_mode);
22167faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez}
22177faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
22187faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezinline const mpreal sqrt  (const long double v, mp_rnd_t rnd_mode)    {   return sqrt(mpreal(v),rnd_mode);    }
22197faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezinline const mpreal sqrt  (const double v, mp_rnd_t rnd_mode)         {   return sqrt(mpreal(v),rnd_mode);    }
22207faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
2221615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal cbrt  (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(cbrt );    }
2222615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal fabs  (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(abs  );    }
2223615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal abs   (const mpreal& x, mp_rnd_t r)                             {   MPREAL_UNARY_MATH_FUNCTION_BODY(abs  );    }
2224615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal log   (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(log  );    }
2225615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal log2  (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(log2 );    }
2226615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal log10 (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(log10);    }
2227615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal exp   (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(exp  );    }
2228615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal exp2  (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(exp2 );    }
2229615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal exp10 (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(exp10);    }
2230615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal cos   (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(cos  );    }
2231615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal sin   (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(sin  );    }
2232615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal tan   (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(tan  );    }
2233615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal sec   (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(sec  );    }
2234615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal csc   (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(csc  );    }
2235615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal cot   (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(cot  );    }
2236615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal acos  (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(acos );    }
2237615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal asin  (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(asin );    }
2238615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal atan  (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(atan );    }
2239615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray
22402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline const mpreal logb  (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   return log2 (abs(x),r);                    }
22412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2242615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal acot  (const mpreal& v, mp_rnd_t r = mpreal::get_default_rnd()) {   return atan (1/v, r);                      }
2243615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal asec  (const mpreal& v, mp_rnd_t r = mpreal::get_default_rnd()) {   return acos (1/v, r);                      }
2244615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal acsc  (const mpreal& v, mp_rnd_t r = mpreal::get_default_rnd()) {   return asin (1/v, r);                      }
2245615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal acoth (const mpreal& v, mp_rnd_t r = mpreal::get_default_rnd()) {   return atanh(1/v, r);                      }
2246615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal asech (const mpreal& v, mp_rnd_t r = mpreal::get_default_rnd()) {   return acosh(1/v, r);                      }
2247615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal acsch (const mpreal& v, mp_rnd_t r = mpreal::get_default_rnd()) {   return asinh(1/v, r);                      }
2248615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray
2249615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal cosh  (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(cosh );    }
2250615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal sinh  (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(sinh );    }
2251615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal tanh  (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(tanh );    }
2252615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal sech  (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(sech );    }
2253615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal csch  (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(csch );    }
2254615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal coth  (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(coth );    }
2255615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal acosh (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(acosh);    }
2256615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal asinh (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(asinh);    }
2257615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal atanh (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(atanh);    }
2258615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray
2259615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal log1p   (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(log1p  );    }
2260615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal expm1   (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(expm1  );    }
2261615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal eint    (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(eint   );    }
2262615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal gamma   (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(gamma  );    }
22632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline const mpreal tgamma  (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(gamma  );    }
2264615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal lngamma (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(lngamma);    }
2265615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal zeta    (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(zeta   );    }
2266615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal erf     (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(erf    );    }
2267615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal erfc    (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(erfc   );    }
2268615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal besselj0(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(j0     );    }
2269615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal besselj1(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(j1     );    }
2270615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal bessely0(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(y0     );    }
2271615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal bessely1(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(y1     );    }
2272615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray
2273615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal atan2 (const mpreal& y, const mpreal& x, mp_rnd_t rnd_mode = mpreal::get_default_rnd())
2274615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray{
2275615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpreal a(0,(std::max)(y.getPrecision(), x.getPrecision()));
2276615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_atan2(a.mpfr_ptr(), y.mpfr_srcptr(), x.mpfr_srcptr(), rnd_mode);
22777faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return a;
2278c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2279c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2280615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal hypot (const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode = mpreal::get_default_rnd())
2281c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2282615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpreal a(0,(std::max)(y.getPrecision(), x.getPrecision()));
2283615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_hypot(a.mpfr_ptr(), x.mpfr_srcptr(), y.mpfr_srcptr(), rnd_mode);
22847faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return a;
2285c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2286c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2287615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal remainder (const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode = mpreal::get_default_rnd())
22882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
2289615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpreal a(0,(std::max)(y.getPrecision(), x.getPrecision()));
2290615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_remainder(a.mpfr_ptr(), x.mpfr_srcptr(), y.mpfr_srcptr(), rnd_mode);
22917faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return a;
2292c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2293c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2294615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal remquo (long* q, const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode = mpreal::get_default_rnd())
2295c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2296615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpreal a(0,(std::max)(y.getPrecision(), x.getPrecision()));
2297615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_remquo(a.mpfr_ptr(),q, x.mpfr_srcptr(), y.mpfr_srcptr(), rnd_mode);
22987faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return a;
2299c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2300c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2301615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal fac_ui (unsigned long int v, mp_prec_t prec     = mpreal::get_default_prec(),
2302615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray                                           mp_rnd_t  rnd_mode = mpreal::get_default_rnd())
2303c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
23047faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal x(0, prec);
2305615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpfr_fac_ui(x.mpfr_ptr(),v,rnd_mode);
23067faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return x;
2307c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2308c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2309c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2310615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal lgamma (const mpreal& v, int *signp = 0, mp_rnd_t rnd_mode = mpreal::get_default_rnd())
2311c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
23127faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal x(v);
23137faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    int tsignp;
2314c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2315615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    if(signp)   mpfr_lgamma(x.mpfr_ptr(),  signp,v.mpfr_srcptr(),rnd_mode);
2316615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    else        mpfr_lgamma(x.mpfr_ptr(),&tsignp,v.mpfr_srcptr(),rnd_mode);
2317c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
23187faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return x;
2319c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2320c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2321c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2322615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal besseljn (long n, const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd())
2323c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2324615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpreal  y(0, x.getPrecision());
23257faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpfr_jn(y.mpfr_ptr(), n, x.mpfr_srcptr(), r);
23267faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return y;
2327c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2328c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2329615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal besselyn (long n, const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd())
2330c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2331615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    mpreal  y(0, x.getPrecision());
23327faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpfr_yn(y.mpfr_ptr(), n, x.mpfr_srcptr(), r);
23337faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return y;
2334c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2335c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2336615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal fma (const mpreal& v1, const mpreal& v2, const mpreal& v3, mp_rnd_t rnd_mode = mpreal::get_default_rnd())
2337c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
23387faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal a;
23397faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mp_prec_t p1, p2, p3;
2340c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
23412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    p1 = v1.get_prec();
23422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    p2 = v2.get_prec();
23432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    p3 = v3.get_prec();
2344c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
23457faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    a.set_prec(p3>p2?(p3>p1?p3:p1):(p2>p1?p2:p1));
2346c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
23477faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpfr_fma(a.mp,v1.mp,v2.mp,v3.mp,rnd_mode);
23487faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return a;
2349c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2350c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2351615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal fms (const mpreal& v1, const mpreal& v2, const mpreal& v3, mp_rnd_t rnd_mode = mpreal::get_default_rnd())
2352c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
23537faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal a;
23547faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mp_prec_t p1, p2, p3;
2355c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
23562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    p1 = v1.get_prec();
23572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    p2 = v2.get_prec();
23582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    p3 = v3.get_prec();
2359c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
23607faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    a.set_prec(p3>p2?(p3>p1?p3:p1):(p2>p1?p2:p1));
2361c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
23627faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpfr_fms(a.mp,v1.mp,v2.mp,v3.mp,rnd_mode);
23637faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return a;
2364c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2365c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2366615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal agm (const mpreal& v1, const mpreal& v2, mp_rnd_t rnd_mode = mpreal::get_default_rnd())
2367c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
23687faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal a;
23697faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mp_prec_t p1, p2;
2370c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
23712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    p1 = v1.get_prec();
23722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    p2 = v2.get_prec();
2373c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
23747faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    a.set_prec(p1>p2?p1:p2);
2375c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
23767faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpfr_agm(a.mp, v1.mp, v2.mp, rnd_mode);
2377c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
23787faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return a;
2379c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2380c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
23812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline const mpreal sum (const mpreal tab[], const unsigned long int n, int& status, mp_rnd_t mode = mpreal::get_default_rnd())
2382c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
23832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpfr_srcptr *p = new mpfr_srcptr[n];
23842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
23852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    for (unsigned long int  i = 0; i < n; i++)
23862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        p[i] = tab[i].mpfr_srcptr();
23872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
23887faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal x;
23892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    status = mpfr_sum(x.mpfr_ptr(), (mpfr_ptr*)p, n, mode);
2390c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
23912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    delete [] p;
23927faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return x;
2393c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2394c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
23957faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez//////////////////////////////////////////////////////////////////////////
23967faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez// MPFR 2.4.0 Specifics
23977faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0))
2398c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2399615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline int sinh_cosh(mpreal& s, mpreal& c, const mpreal& v, mp_rnd_t rnd_mode = mpreal::get_default_rnd())
2400c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
24017faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return mpfr_sinh_cosh(s.mp,c.mp,v.mp,rnd_mode);
2402c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2403c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
24042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline const mpreal li2 (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd())
24052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
24062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    MPREAL_UNARY_MATH_FUNCTION_BODY(li2);
2407c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2408c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2409615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal rem (const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode = mpreal::get_default_rnd())
2410c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
24117faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    /*  R = rem(X,Y) if Y != 0, returns X - n * Y where n = trunc(X/Y). */
24127faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return fmod(x, y, rnd_mode);
2413c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2414c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2415615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal mod (const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode = mpreal::get_default_rnd())
2416c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
24177faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    (void)rnd_mode;
24182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
24192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    /*
2420c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
24217faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    m = mod(x,y) if y != 0, returns x - n*y where n = floor(x/y)
2422c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
24237faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    The following are true by convention:
24247faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    - mod(x,0) is x
24257faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    - mod(x,x) is 0
24262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    - mod(x,y) for x != y and y != 0 has the same sign as y.
24272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
24287faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    */
2429c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
24307faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    if(iszero(y)) return x;
24317faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    if(x == y) return 0;
2432c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
24337faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal m = x - floor(x / y) * y;
24342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
24357faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    m.setSign(sgn(y)); // make sure result has the same sign as Y
2436c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
24377faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return m;
2438c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2439c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2440615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal fmod (const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode = mpreal::get_default_rnd())
2441c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
24427faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal a;
24437faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mp_prec_t yp, xp;
2444c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
24452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    yp = y.get_prec();
24462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    xp = x.get_prec();
2447c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
24487faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    a.set_prec(yp>xp?yp:xp);
2449c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
24507faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpfr_fmod(a.mp, x.mp, y.mp, rnd_mode);
2451c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
24527faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return a;
2453c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2454c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2455615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal rec_sqrt(const mpreal& v, mp_rnd_t rnd_mode = mpreal::get_default_rnd())
2456c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
24577faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal x(v);
24587faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpfr_rec_sqrt(x.mp,v.mp,rnd_mode);
24597faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return x;
2460c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2461c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif //  MPFR 2.4.0 Specifics
2462c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2463c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
2464c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// MPFR 3.0.0 Specifics
2465c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if (MPFR_VERSION >= MPFR_VERSION_NUM(3,0,0))
2466615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal digamma (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(digamma);     }
2467615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal ai      (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(ai);          }
2468c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // MPFR 3.0.0 Specifics
2469c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2470c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
2471c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Constants
2472615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal const_log2 (mp_prec_t p = mpreal::get_default_prec(), mp_rnd_t r = mpreal::get_default_rnd())
2473c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
24747faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal x(0, p);
24757faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpfr_const_log2(x.mpfr_ptr(), r);
24767faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return x;
2477c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2478c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2479615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal const_pi (mp_prec_t p = mpreal::get_default_prec(), mp_rnd_t r = mpreal::get_default_rnd())
2480c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
24817faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal x(0, p);
24827faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpfr_const_pi(x.mpfr_ptr(), r);
24837faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return x;
2484c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2485c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2486615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal const_euler (mp_prec_t p = mpreal::get_default_prec(), mp_rnd_t r = mpreal::get_default_rnd())
2487c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
24887faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal x(0, p);
24897faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpfr_const_euler(x.mpfr_ptr(), r);
24907faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return x;
2491c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2492c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2493615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal const_catalan (mp_prec_t p = mpreal::get_default_prec(), mp_rnd_t r = mpreal::get_default_rnd())
2494c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
24957faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal x(0, p);
24967faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpfr_const_catalan(x.mpfr_ptr(), r);
24977faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return x;
2498c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2499c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2500615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal const_infinity (int sign = 1, mp_prec_t p = mpreal::get_default_prec())
2501c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
25027faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal x(0, p);
25037faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpfr_set_inf(x.mpfr_ptr(), sign);
25047faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return x;
2505c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2506c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2507c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
2508c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Integer Related Functions
2509c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal ceil(const mpreal& v)
2510c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
25117faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal x(v);
25127faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpfr_ceil(x.mp,v.mp);
25137faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return x;
2514c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2515c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2516c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal floor(const mpreal& v)
2517c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
25187faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal x(v);
25197faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpfr_floor(x.mp,v.mp);
25207faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return x;
2521c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2522c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2523c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal round(const mpreal& v)
2524c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
25257faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal x(v);
25267faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpfr_round(x.mp,v.mp);
25277faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return x;
2528c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2529c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2530c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal trunc(const mpreal& v)
2531c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
25327faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal x(v);
25337faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpfr_trunc(x.mp,v.mp);
25347faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return x;
2535c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2536c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2537615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal rint       (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(rint      );     }
2538615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal rint_ceil  (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(rint_ceil );     }
2539615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal rint_floor (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(rint_floor);     }
2540615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal rint_round (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(rint_round);     }
2541615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal rint_trunc (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(rint_trunc);     }
2542615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal frac       (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(frac      );     }
2543c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2544c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
2545c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Miscellaneous Functions
25467faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezinline void         swap (mpreal& a, mpreal& b)            {    mpfr_swap(a.mp,b.mp);   }
25477faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezinline const mpreal (max)(const mpreal& x, const mpreal& y){    return (x>y?x:y);       }
25487faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezinline const mpreal (min)(const mpreal& x, const mpreal& y){    return (x<y?x:y);       }
2549c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2550615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal fmax(const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode = mpreal::get_default_rnd())
2551c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
25527faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal a;
25537faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpfr_max(a.mp,x.mp,y.mp,rnd_mode);
25547faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return a;
2555c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2556c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2557615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal fmin(const mpreal& x, const mpreal& y,  mp_rnd_t rnd_mode = mpreal::get_default_rnd())
2558c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
25597faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal a;
25607faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpfr_min(a.mp,x.mp,y.mp,rnd_mode);
25617faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return a;
2562c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2563c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2564c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal nexttoward (const mpreal& x, const mpreal& y)
2565c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
25667faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal a(x);
25677faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpfr_nexttoward(a.mp,y.mp);
25687faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return a;
2569c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2570c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2571c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal nextabove  (const mpreal& x)
2572c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
25737faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal a(x);
25747faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpfr_nextabove(a.mp);
25757faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return a;
2576c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2577c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2578c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal nextbelow  (const mpreal& x)
2579c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
25807faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal a(x);
25817faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpfr_nextbelow(a.mp);
25827faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return a;
2583c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2584c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2585c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal urandomb (gmp_randstate_t& state)
2586c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
25877faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal x;
25882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpfr_urandomb(x.mpfr_ptr(),state);
25897faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return x;
2590c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2591c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
25922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#if (MPFR_VERSION >= MPFR_VERSION_NUM(3,0,0))
2593615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal urandom (gmp_randstate_t& state, mp_rnd_t rnd_mode = mpreal::get_default_rnd())
2594c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
25957faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal x;
25962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpfr_urandom(x.mpfr_ptr(), state, rnd_mode);
2597615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    return x;
2598615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray}
25992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#endif
2600c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2601c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if (MPFR_VERSION <= MPFR_VERSION_NUM(2,4,2))
2602c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal random2 (mp_size_t size, mp_exp_t exp)
2603c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
26047faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal x;
26052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpfr_random2(x.mpfr_ptr(),size,exp);
26067faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return x;
2607c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2608c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
2609c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2610c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Uniformly distributed random number generation
2611c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// a = random(seed); <- initialization & first random number generation
2612c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// a = random();     <- next random numbers generation
2613c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// seed != 0
2614615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal random(unsigned int seed = 0)
2615c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2616c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if (MPFR_VERSION >= MPFR_VERSION_NUM(3,0,0))
26177faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    static gmp_randstate_t state;
26182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    static bool initialize = true;
2619c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
26202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    if(initialize)
26217faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    {
26227faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        gmp_randinit_default(state);
26237faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        gmp_randseed_ui(state,0);
26242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        initialize = false;
26257faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    }
2626c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
26277faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    if(seed != 0)    gmp_randseed_ui(state,seed);
2628c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
26297faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return mpfr::urandom(state);
2630c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#else
26317faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    if(seed != 0)    std::srand(seed);
26327faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return mpfr::mpreal(std::rand()/(double)RAND_MAX);
2633c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
2634c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2635c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2636c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
26372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#if (MPFR_VERSION >= MPFR_VERSION_NUM(3,1,0))
26382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
26392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline const mpreal grandom (gmp_randstate_t& state, mp_rnd_t rnd_mode = mpreal::get_default_rnd())
26402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
26412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpreal x;
26422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpfr_grandom(x.mpfr_ptr(), NULL, state, rnd_mode);
26432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return x;
26442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}
26452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2646615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal grandom(unsigned int seed = 0)
2647615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray{
2648615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    static gmp_randstate_t state;
26492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    static bool initialize = true;
2650615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray
26512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    if(initialize)
2652615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    {
2653615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray        gmp_randinit_default(state);
2654615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray        gmp_randseed_ui(state,0);
26552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        initialize = false;
2656615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    }
2657615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray
2658615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    if(seed != 0) gmp_randseed_ui(state,seed);
2659615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray
2660615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    return mpfr::grandom(state);
2661615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray}
2662615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray#endif
2663615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray
2664c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
2665c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Set/Get global properties
2666c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline void mpreal::set_default_prec(mp_prec_t prec)
26672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
26682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpfr_set_default_prec(prec);
2669c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2670c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2671c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline void mpreal::set_default_rnd(mp_rnd_t rnd_mode)
26722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
26732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mpfr_set_default_rounding_mode(rnd_mode);
2674c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2675c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2676c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline bool mpreal::fits_in_bits(double x, int n)
26772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
26787faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    int i;
26797faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    double t;
26807faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return IsInf(x) || (std::modf ( std::ldexp ( std::frexp ( x, &i ), n ), &t ) == 0.0);
2681c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2682c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2683615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal pow(const mpreal& a, const mpreal& b, mp_rnd_t rnd_mode = mpreal::get_default_rnd())
2684c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
26857faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal x(a);
26867faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpfr_pow(x.mp,x.mp,b.mp,rnd_mode);
26877faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return x;
2688c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2689c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2690615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal pow(const mpreal& a, const mpz_t b, mp_rnd_t rnd_mode = mpreal::get_default_rnd())
2691c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
26927faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal x(a);
26937faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpfr_pow_z(x.mp,x.mp,b,rnd_mode);
26947faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return x;
2695c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2696c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2697615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal pow(const mpreal& a, const unsigned long int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd())
2698c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
26997faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal x(a);
27007faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpfr_pow_ui(x.mp,x.mp,b,rnd_mode);
27017faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return x;
2702c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2703c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2704c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const mpreal& a, const unsigned int b, mp_rnd_t rnd_mode)
2705c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
27067faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return pow(a,static_cast<unsigned long int>(b),rnd_mode);
2707c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2708c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2709615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal pow(const mpreal& a, const long int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd())
2710c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
27117faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal x(a);
27127faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpfr_pow_si(x.mp,x.mp,b,rnd_mode);
27137faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return x;
2714c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2715c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2716c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const mpreal& a, const int b, mp_rnd_t rnd_mode)
2717c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
27187faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return pow(a,static_cast<long int>(b),rnd_mode);
2719c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2720c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2721c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const mpreal& a, const long double b, mp_rnd_t rnd_mode)
2722c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
27237faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return pow(a,mpreal(b),rnd_mode);
2724c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2725c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2726c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const mpreal& a, const double b, mp_rnd_t rnd_mode)
2727c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
27287faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return pow(a,mpreal(b),rnd_mode);
2729c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2730c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2731615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayinline const mpreal pow(const unsigned long int a, const mpreal& b, mp_rnd_t rnd_mode = mpreal::get_default_rnd())
2732c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
27337faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal x(a);
27347faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpfr_ui_pow(x.mp,a,b.mp,rnd_mode);
27357faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return x;
2736c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2737c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2738c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const unsigned int a, const mpreal& b, mp_rnd_t rnd_mode)
2739c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
27407faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return pow(static_cast<unsigned long int>(a),b,rnd_mode);
2741c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2742c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2743c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const long int a, const mpreal& b, mp_rnd_t rnd_mode)
2744c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
27457faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    if (a>=0)     return pow(static_cast<unsigned long int>(a),b,rnd_mode);
2746615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    else          return pow(mpreal(a),b,rnd_mode);
2747c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2748c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2749c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const int a, const mpreal& b, mp_rnd_t rnd_mode)
2750c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
27517faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    if (a>=0)     return pow(static_cast<unsigned long int>(a),b,rnd_mode);
2752615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    else          return pow(mpreal(a),b,rnd_mode);
2753c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2754c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2755c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const long double a, const mpreal& b, mp_rnd_t rnd_mode)
2756c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
27577faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return pow(mpreal(a),b,rnd_mode);
2758c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2759c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2760c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const double a, const mpreal& b, mp_rnd_t rnd_mode)
2761c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
27627faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return pow(mpreal(a),b,rnd_mode);
2763c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2764c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2765c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// pow unsigned long int
2766c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const unsigned long int a, const unsigned long int b, mp_rnd_t rnd_mode)
2767c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
27687faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpreal x(a);
27697faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    mpfr_ui_pow_ui(x.mp,a,b,rnd_mode);
27707faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return x;
2771c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2772c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2773c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const unsigned long int a, const unsigned int b, mp_rnd_t rnd_mode)
2774c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
27757faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return pow(a,static_cast<unsigned long int>(b),rnd_mode); //mpfr_ui_pow_ui
2776c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2777c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2778c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const unsigned long int a, const long int b, mp_rnd_t rnd_mode)
2779c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
27807faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    if(b>0)    return pow(a,static_cast<unsigned long int>(b),rnd_mode); //mpfr_ui_pow_ui
2781615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    else       return pow(a,mpreal(b),rnd_mode); //mpfr_ui_pow
2782c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2783c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2784c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const unsigned long int a, const int b, mp_rnd_t rnd_mode)
2785c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
27867faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    if(b>0)    return pow(a,static_cast<unsigned long int>(b),rnd_mode); //mpfr_ui_pow_ui
2787615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    else       return pow(a,mpreal(b),rnd_mode); //mpfr_ui_pow
2788c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2789c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2790c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const unsigned long int a, const long double b, mp_rnd_t rnd_mode)
2791c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
27927faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return pow(a,mpreal(b),rnd_mode); //mpfr_ui_pow
2793c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2794c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2795c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const unsigned long int a, const double b, mp_rnd_t rnd_mode)
2796c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
27977faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return pow(a,mpreal(b),rnd_mode); //mpfr_ui_pow
2798c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2799c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2800c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// pow unsigned int
2801c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const unsigned int a, const unsigned long int b, mp_rnd_t rnd_mode)
2802c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
28037faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return pow(static_cast<unsigned long int>(a),b,rnd_mode); //mpfr_ui_pow_ui
2804c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2805c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2806c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const unsigned int a, const unsigned int b, mp_rnd_t rnd_mode)
2807c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
28087faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return pow(static_cast<unsigned long int>(a),static_cast<unsigned long int>(b),rnd_mode); //mpfr_ui_pow_ui
2809c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2810c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2811c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const unsigned int a, const long int b, mp_rnd_t rnd_mode)
2812c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
28137faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    if(b>0) return pow(static_cast<unsigned long int>(a),static_cast<unsigned long int>(b),rnd_mode); //mpfr_ui_pow_ui
28147faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    else    return pow(static_cast<unsigned long int>(a),mpreal(b),rnd_mode); //mpfr_ui_pow
2815c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2816c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2817c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const unsigned int a, const int b, mp_rnd_t rnd_mode)
2818c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
28197faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    if(b>0) return pow(static_cast<unsigned long int>(a),static_cast<unsigned long int>(b),rnd_mode); //mpfr_ui_pow_ui
28207faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    else    return pow(static_cast<unsigned long int>(a),mpreal(b),rnd_mode); //mpfr_ui_pow
2821c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2822c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2823c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const unsigned int a, const long double b, mp_rnd_t rnd_mode)
2824c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
28257faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return pow(static_cast<unsigned long int>(a),mpreal(b),rnd_mode); //mpfr_ui_pow
2826c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2827c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2828c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const unsigned int a, const double b, mp_rnd_t rnd_mode)
2829c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
28307faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return pow(static_cast<unsigned long int>(a),mpreal(b),rnd_mode); //mpfr_ui_pow
2831c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2832c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2833c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// pow long int
2834c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const long int a, const unsigned long int b, mp_rnd_t rnd_mode)
2835c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
28367faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    if (a>0) return pow(static_cast<unsigned long int>(a),b,rnd_mode); //mpfr_ui_pow_ui
28377faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    else     return pow(mpreal(a),b,rnd_mode); //mpfr_pow_ui
2838c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2839c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2840c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const long int a, const unsigned int b, mp_rnd_t rnd_mode)
2841c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
28427faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    if (a>0) return pow(static_cast<unsigned long int>(a),static_cast<unsigned long int>(b),rnd_mode);  //mpfr_ui_pow_ui
28437faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    else     return pow(mpreal(a),static_cast<unsigned long int>(b),rnd_mode); //mpfr_pow_ui
2844c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2845c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2846c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const long int a, const long int b, mp_rnd_t rnd_mode)
2847c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
28487faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    if (a>0)
28497faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    {
28507faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        if(b>0) return pow(static_cast<unsigned long int>(a),static_cast<unsigned long int>(b),rnd_mode); //mpfr_ui_pow_ui
28517faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        else    return pow(static_cast<unsigned long int>(a),mpreal(b),rnd_mode); //mpfr_ui_pow
28527faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    }else{
28537faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        return pow(mpreal(a),b,rnd_mode); // mpfr_pow_si
28547faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    }
2855c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2856c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2857c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const long int a, const int b, mp_rnd_t rnd_mode)
2858c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
28597faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    if (a>0)
28607faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    {
28617faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        if(b>0) return pow(static_cast<unsigned long int>(a),static_cast<unsigned long int>(b),rnd_mode); //mpfr_ui_pow_ui
28627faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        else    return pow(static_cast<unsigned long int>(a),mpreal(b),rnd_mode); //mpfr_ui_pow
28637faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    }else{
28647faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        return pow(mpreal(a),static_cast<long int>(b),rnd_mode); // mpfr_pow_si
28657faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    }
2866c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2867c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2868c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const long int a, const long double b, mp_rnd_t rnd_mode)
2869c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
28707faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    if (a>=0)   return pow(static_cast<unsigned long int>(a),mpreal(b),rnd_mode); //mpfr_ui_pow
28717faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    else        return pow(mpreal(a),mpreal(b),rnd_mode); //mpfr_pow
2872c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2873c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2874c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const long int a, const double b, mp_rnd_t rnd_mode)
2875c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
28767faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    if (a>=0)   return pow(static_cast<unsigned long int>(a),mpreal(b),rnd_mode); //mpfr_ui_pow
28777faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    else        return pow(mpreal(a),mpreal(b),rnd_mode); //mpfr_pow
2878c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2879c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2880c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// pow int
2881c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const int a, const unsigned long int b, mp_rnd_t rnd_mode)
2882c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
28837faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    if (a>0) return pow(static_cast<unsigned long int>(a),b,rnd_mode); //mpfr_ui_pow_ui
28847faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    else     return pow(mpreal(a),b,rnd_mode); //mpfr_pow_ui
2885c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2886c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2887c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const int a, const unsigned int b, mp_rnd_t rnd_mode)
2888c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
28897faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    if (a>0) return pow(static_cast<unsigned long int>(a),static_cast<unsigned long int>(b),rnd_mode);  //mpfr_ui_pow_ui
28907faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    else     return pow(mpreal(a),static_cast<unsigned long int>(b),rnd_mode); //mpfr_pow_ui
2891c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2892c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2893c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const int a, const long int b, mp_rnd_t rnd_mode)
2894c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
28957faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    if (a>0)
28967faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    {
28977faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        if(b>0) return pow(static_cast<unsigned long int>(a),static_cast<unsigned long int>(b),rnd_mode); //mpfr_ui_pow_ui
28987faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        else    return pow(static_cast<unsigned long int>(a),mpreal(b),rnd_mode); //mpfr_ui_pow
28997faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    }else{
29007faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        return pow(mpreal(a),b,rnd_mode); // mpfr_pow_si
29017faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    }
2902c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2903c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2904c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const int a, const int b, mp_rnd_t rnd_mode)
2905c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
29067faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    if (a>0)
29077faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    {
29087faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        if(b>0) return pow(static_cast<unsigned long int>(a),static_cast<unsigned long int>(b),rnd_mode); //mpfr_ui_pow_ui
29097faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        else    return pow(static_cast<unsigned long int>(a),mpreal(b),rnd_mode); //mpfr_ui_pow
29107faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    }else{
29117faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        return pow(mpreal(a),static_cast<long int>(b),rnd_mode); // mpfr_pow_si
29127faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    }
2913c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2914c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2915c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const int a, const long double b, mp_rnd_t rnd_mode)
2916c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
29177faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    if (a>=0)   return pow(static_cast<unsigned long int>(a),mpreal(b),rnd_mode); //mpfr_ui_pow
29187faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    else        return pow(mpreal(a),mpreal(b),rnd_mode); //mpfr_pow
2919c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2920c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2921c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const int a, const double b, mp_rnd_t rnd_mode)
2922c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
29237faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    if (a>=0)   return pow(static_cast<unsigned long int>(a),mpreal(b),rnd_mode); //mpfr_ui_pow
29247faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    else        return pow(mpreal(a),mpreal(b),rnd_mode); //mpfr_pow
2925c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2926c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
29272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// pow long double
2928c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const long double a, const long double b, mp_rnd_t rnd_mode)
2929c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
29307faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return pow(mpreal(a),mpreal(b),rnd_mode);
2931c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2932c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2933c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const long double a, const unsigned long int b, mp_rnd_t rnd_mode)
2934c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
29357faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return pow(mpreal(a),b,rnd_mode); //mpfr_pow_ui
2936c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2937c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2938c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const long double a, const unsigned int b, mp_rnd_t rnd_mode)
2939c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
29407faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return pow(mpreal(a),static_cast<unsigned long int>(b),rnd_mode); //mpfr_pow_ui
2941c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2942c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2943c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const long double a, const long int b, mp_rnd_t rnd_mode)
2944c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
29457faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return pow(mpreal(a),b,rnd_mode); // mpfr_pow_si
2946c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2947c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2948c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const long double a, const int b, mp_rnd_t rnd_mode)
2949c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
29507faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return pow(mpreal(a),static_cast<long int>(b),rnd_mode); // mpfr_pow_si
2951c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2952c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2953c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const double a, const double b, mp_rnd_t rnd_mode)
2954c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
29557faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return pow(mpreal(a),mpreal(b),rnd_mode);
2956c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2957c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2958c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const double a, const unsigned long int b, mp_rnd_t rnd_mode)
2959c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
29607faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return pow(mpreal(a),b,rnd_mode); // mpfr_pow_ui
2961c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2962c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2963c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const double a, const unsigned int b, mp_rnd_t rnd_mode)
2964c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
29657faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return pow(mpreal(a),static_cast<unsigned long int>(b),rnd_mode); // mpfr_pow_ui
2966c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2967c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2968c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const double a, const long int b, mp_rnd_t rnd_mode)
2969c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
29707faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return pow(mpreal(a),b,rnd_mode); // mpfr_pow_si
2971c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2972c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2973c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const double a, const int b, mp_rnd_t rnd_mode)
2974c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
29757faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return pow(mpreal(a),static_cast<long int>(b),rnd_mode); // mpfr_pow_si
2976c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2977c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // End of mpfr namespace
2978c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2979c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Explicit specialization of std::swap for mpreal numbers
2980c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Thus standard algorithms will use efficient version of swap (due to Koenig lookup)
2981c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Non-throwing swap C++ idiom: http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Non-throwing_swap
2982c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace std
2983c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2984615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray  // we are allowed to extend namespace std with specializations only
29857faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    template <>
29862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline void swap(mpfr::mpreal& x, mpfr::mpreal& y)
29872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    {
29882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        return mpfr::swap(x, y);
29897faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    }
29907faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
29917faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    template<>
29927faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    class numeric_limits<mpfr::mpreal>
29937faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    {
29947faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    public:
29957faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        static const bool is_specialized    = true;
29967faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        static const bool is_signed         = true;
29977faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        static const bool is_integer        = false;
29987faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        static const bool is_exact          = false;
29992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        static const int  radix             = 2;
30007faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
30017faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        static const bool has_infinity      = true;
30027faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        static const bool has_quiet_NaN     = true;
30037faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        static const bool has_signaling_NaN = true;
30047faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
30057faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        static const bool is_iec559         = true;        // = IEEE 754
30067faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        static const bool is_bounded        = true;
30077faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        static const bool is_modulo         = false;
30087faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        static const bool traps             = true;
30097faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        static const bool tinyness_before   = true;
30107faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
30117faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        static const float_denorm_style has_denorm  = denorm_absent;
30127faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
30137faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        inline static mpfr::mpreal (min)    (mp_prec_t precision = mpfr::mpreal::get_default_prec()) {  return  mpfr::minval(precision);  }
30147faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        inline static mpfr::mpreal (max)    (mp_prec_t precision = mpfr::mpreal::get_default_prec()) {  return  mpfr::maxval(precision);  }
30157faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        inline static mpfr::mpreal lowest   (mp_prec_t precision = mpfr::mpreal::get_default_prec()) {  return -mpfr::maxval(precision);  }
30167faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
30177faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        // Returns smallest eps such that 1 + eps != 1 (classic machine epsilon)
30187faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        inline static mpfr::mpreal epsilon(mp_prec_t precision = mpfr::mpreal::get_default_prec()) {  return  mpfr::machine_epsilon(precision); }
30192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
30207faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        // Returns smallest eps such that x + eps != x (relative machine epsilon)
30217faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        inline static mpfr::mpreal epsilon(const mpfr::mpreal& x) {  return mpfr::machine_epsilon(x);  }
30227faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
30237faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        inline static mpfr::mpreal round_error(mp_prec_t precision = mpfr::mpreal::get_default_prec())
30247faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        {
30257faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez            mp_rnd_t r = mpfr::mpreal::get_default_rnd();
30267faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
30272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang            if(r == GMP_RNDN)  return mpfr::mpreal(0.5, precision);
30282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang            else               return mpfr::mpreal(1.0, precision);
30297faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        }
30307faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
30317faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        inline static const mpfr::mpreal infinity()         { return mpfr::const_infinity();     }
30327faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        inline static const mpfr::mpreal quiet_NaN()        { return mpfr::mpreal().setNan();    }
30337faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        inline static const mpfr::mpreal signaling_NaN()    { return mpfr::mpreal().setNan();    }
30347faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        inline static const mpfr::mpreal denorm_min()       { return (min)();                    }
30357faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
30367faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        // Please note, exponent range is not fixed in MPFR
30377faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        static const int min_exponent = MPFR_EMIN_DEFAULT;
30387faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        static const int max_exponent = MPFR_EMAX_DEFAULT;
30392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        MPREAL_PERMISSIVE_EXPR static const int min_exponent10 = (int) (MPFR_EMIN_DEFAULT * 0.3010299956639811);
30402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        MPREAL_PERMISSIVE_EXPR static const int max_exponent10 = (int) (MPFR_EMAX_DEFAULT * 0.3010299956639811);
30417faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
3042615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray#ifdef MPREAL_HAVE_DYNAMIC_STD_NUMERIC_LIMITS
3043615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray
3044615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray        // Following members should be constant according to standard, but they can be variable in MPFR
30452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        // So we define them as functions here.
3046615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray        //
3047615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray        // This is preferable way for std::numeric_limits<mpfr::mpreal> specialization.
30482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        // But it is incompatible with standard std::numeric_limits and might not work with other libraries, e.g. boost.
30492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        // See below for compatible implementation.
3050615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray        inline static float_round_style round_style()
3051615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray        {
3052615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray            mp_rnd_t r = mpfr::mpreal::get_default_rnd();
3053615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray
3054615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray            switch (r)
3055615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray            {
3056615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray            case GMP_RNDN: return round_to_nearest;
30572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang            case GMP_RNDZ: return round_toward_zero;
30582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang            case GMP_RNDU: return round_toward_infinity;
30592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang            case GMP_RNDD: return round_toward_neg_infinity;
3060615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray            default: return round_indeterminate;
3061615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray            }
3062615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray        }
30637faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
3064615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray        inline static int digits()                        {    return int(mpfr::mpreal::get_default_prec());    }
3065615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray        inline static int digits(const mpfr::mpreal& x)   {    return x.getPrecision();                         }
30667faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
30677faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        inline static int digits10(mp_prec_t precision = mpfr::mpreal::get_default_prec())
30687faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        {
30697faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez            return mpfr::bits2digits(precision);
30707faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        }
30717faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
30727faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        inline static int digits10(const mpfr::mpreal& x)
30737faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        {
30747faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez            return mpfr::bits2digits(x.getPrecision());
30757faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        }
30767faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
30777faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        inline static int max_digits10(mp_prec_t precision = mpfr::mpreal::get_default_prec())
30787faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        {
30797faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez            return digits10(precision);
30807faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        }
3081615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray#else
3082615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray        // Digits and round_style are NOT constants when it comes to mpreal.
3083615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray        // If possible, please use functions digits() and round_style() defined above.
3084615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray        //
3085615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray        // These (default) values are preserved for compatibility with existing libraries, e.g. boost.
30862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        // Change them accordingly to your application.
3087615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray        //
3088615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray        // For example, if you use 256 bits of precision uniformly in your program, then:
3089615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray        // digits       = 256
30902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        // digits10     = 77
3091615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray        // max_digits10 = 78
30922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        //
3093615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray        // Approximate formula for decimal digits is: digits10 = floor(log10(2) * digits). See bits2digits() for more details.
3094615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray
3095615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray        static const std::float_round_style round_style = round_to_nearest;
3096615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray        static const int digits       = 53;
3097615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray        static const int digits10     = 15;
3098615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray        static const int max_digits10 = 16;
3099615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray#endif
31007faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    };
31017faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
3102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
3103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
3104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif /* __MPREAL_H__ */
3105