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