1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/*
2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	Multi-precision real number class. C++ interface for MPFR library.
3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	Project homepage: http://www.holoborodko.com/pavel/
4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	Contact e-mail:   pavel@holoborodko.com
5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	Copyright (c) 2008-2012 Pavel Holoborodko
7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	Core Developers:
9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	Pavel Holoborodko, Dmitriy Gubanov, Konstantin Holoborodko.
10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	Contributors:
12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	Brian Gladman, Helmut Jarausch, Fokko Beekhof, Ulrich Mutze,
13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	Heinz van Saanen, Pere Constans, Peter van Hoof, Gael Guennebaud,
14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	Tsai Chia Cheng, Alexei Zubanov.
15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	****************************************************************************
17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	This library is free software; you can redistribute it and/or
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	modify it under the terms of the GNU Lesser General Public
19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	License as published by the Free Software Foundation; either
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	version 2.1 of the License, or (at your option) any later version.
21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	This library is distributed in the hope that it will be useful,
23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	but WITHOUT ANY WARRANTY; without even the implied warranty of
24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	Lesser General Public License for more details.
26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	You should have received a copy of the GNU Lesser General Public
28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	License along with this library; if not, write to the Free Software
29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	****************************************************************************
32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	Redistribution and use in source and binary forms, with or without
33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	modification, are permitted provided that the following conditions
34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	are met:
35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	1. Redistributions of source code must retain the above copyright
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	notice, this list of conditions and the following disclaimer.
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	2. Redistributions in binary form must reproduce the above copyright
40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	notice, this list of conditions and the following disclaimer in the
41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	documentation and/or other materials provided with the distribution.
42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	3. The name of the author may be used to endorse or promote products
44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	derived from this software without specific prior written permission.
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	SUCH DAMAGE.
57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath*/
58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef __MPREAL_H__
60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define __MPREAL_H__
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <string>
63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <iostream>
64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <sstream>
65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <stdexcept>
66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <cfloat>
67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <cmath>
68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Options
70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define MPREAL_HAVE_INT64_SUPPORT							// int64_t support: available only for MSVC 2010 & GCC
71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define MPREAL_HAVE_MSVC_DEBUGVIEW							// Enable Debugger Visualizer (valid only for MSVC in "Debug" builds)
72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Detect compiler using signatures from http://predef.sourceforge.net/
74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if defined(__GNUC__) && defined(__INTEL_COMPILER)
75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	#define IsInf(x) isinf(x)								// Intel ICC compiler on Linux
76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#elif defined(_MSC_VER)										// Microsoft Visual C++
78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	#define IsInf(x) (!_finite(x))
79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#elif defined(__GNUC__)
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	#define IsInf(x) std::isinf(x)							// GNU C/C++
82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#else
84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	#define IsInf(x) std::isinf(x)							// Unknown compiler, just hope for C99 conformance
85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if defined(MPREAL_HAVE_INT64_SUPPORT)
88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	#define MPFR_USE_INTMAX_T								// should be defined before mpfr.h
90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	#if defined(_MSC_VER) 									// <stdint.h> is available only in msvc2010!
92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath		#if (_MSC_VER >= 1600)
93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath			#include <stdint.h>
94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath		#else												// MPFR relies on intmax_t which is available only in msvc2010
95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath			#undef MPREAL_HAVE_INT64_SUPPORT				// Besides, MPFR - MPIR have to be compiled with msvc2010
96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath			#undef MPFR_USE_INTMAX_T						// Since we cannot detect this, disable x64 by default
97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath															// Someone should change this manually if needed.
98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath		#endif
99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	#endif
100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	#if defined (__MINGW32__) || defined(__MINGW64__)
102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath			#include <stdint.h>								// equivalent to msvc2010
103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	#elif defined (__GNUC__)
104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath		#if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64)
105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath			#undef MPREAL_HAVE_INT64_SUPPORT				// remove all shaman dances for x64 builds since
106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath			#undef MPFR_USE_INTMAX_T						// GCC already support x64 as of "long int" is 64-bit integer, nothing left to do
107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath		#else
108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath			#include <stdint.h>								// use int64_t, uint64_t otherwise.
109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath		#endif
110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	#endif
111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if defined(MPREAL_HAVE_MSVC_DEBUGVIEW) && defined(_MSC_VER) && defined(_DEBUG)
115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define MPREAL_MSVC_DEBUGVIEW_CODE 		DebugView = toString()
116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	#define MPREAL_MSVC_DEBUGVIEW_DATA 	std::string DebugView
117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#else
118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	#define MPREAL_MSVC_DEBUGVIEW_CODE
119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	#define MPREAL_MSVC_DEBUGVIEW_DATA
120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <mpfr.h>
123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if (MPFR_VERSION < MPFR_VERSION_NUM(3,0,0))
125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	#include <cstdlib>										// needed for random()
126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace mpfr {
129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass mpreal {
131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathprivate:
132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_t mp;
133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathpublic:
135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	static mp_rnd_t			default_rnd;
136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	static mp_prec_t		default_prec;
137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	static int				default_base;
138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	static int				double_bits;
139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathpublic:
141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// Constructors && type conversion
142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal();
143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal(const mpreal& u);
144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal(const mpfr_t u);
145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal(const mpf_t u);
146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal(const mpz_t u, mp_prec_t prec = default_prec, mp_rnd_t mode = default_rnd);
147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal(const mpq_t u, mp_prec_t prec = default_prec, mp_rnd_t mode = default_rnd);
148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal(const double u, mp_prec_t prec = default_prec, mp_rnd_t mode = default_rnd);
149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal(const long double u, mp_prec_t prec = default_prec, mp_rnd_t mode = default_rnd);
150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal(const unsigned long int u, mp_prec_t prec = default_prec, mp_rnd_t mode = default_rnd);
151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal(const unsigned int u, mp_prec_t prec = default_prec, mp_rnd_t mode = default_rnd);
152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal(const long int u, mp_prec_t prec = default_prec, mp_rnd_t mode = default_rnd);
153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal(const int u, mp_prec_t prec = default_prec, mp_rnd_t mode = default_rnd);
154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if defined (MPREAL_HAVE_INT64_SUPPORT)
156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal(const uint64_t u, mp_prec_t prec = default_prec,  mp_rnd_t mode = default_rnd);
157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal(const int64_t u, mp_prec_t prec = default_prec,  mp_rnd_t mode = default_rnd);
158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal(const char* s, mp_prec_t prec = default_prec, int base = default_base, mp_rnd_t mode = default_rnd);
161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal(const std::string& s, mp_prec_t prec = default_prec, int base = default_base, mp_rnd_t mode = default_rnd);
162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	~mpreal();
164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// Operations
166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// =
167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// +, -, *, /, ++, --, <<, >>
168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// *=, +=, -=, /=,
169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// <, >, ==, <=, >=
170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// =
172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator=(const mpreal& v);
173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator=(const mpf_t v);
174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator=(const mpz_t v);
175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator=(const mpq_t v);
176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator=(const long double v);
177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator=(const double v);
178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator=(const unsigned long int v);
179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator=(const unsigned int v);
180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator=(const long int v);
181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator=(const int v);
182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator=(const char* s);
183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// +
185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator+=(const mpreal& v);
186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator+=(const mpf_t v);
187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator+=(const mpz_t v);
188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator+=(const mpq_t v);
189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator+=(const long double u);
190c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator+=(const double u);
191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator+=(const unsigned long int u);
192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator+=(const unsigned int u);
193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator+=(const long int u);
194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator+=(const int u);
195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if defined (MPREAL_HAVE_INT64_SUPPORT)
197c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator+=(const int64_t  u);
198c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator+=(const uint64_t u);
199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator-=(const int64_t  u);
200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator-=(const uint64_t u);
201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator*=(const int64_t  u);
202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator*=(const uint64_t u);
203c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator/=(const int64_t  u);
204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator/=(const uint64_t u);
205c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
206c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
207c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	const mpreal operator+() const;
208c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator++ ();
209c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	const mpreal  operator++ (int);
210c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
211c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// -
212c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator-=(const mpreal& v);
213c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator-=(const mpz_t v);
214c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator-=(const mpq_t v);
215c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator-=(const long double u);
216c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator-=(const double u);
217c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator-=(const unsigned long int u);
218c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator-=(const unsigned int u);
219c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator-=(const long int u);
220c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator-=(const int u);
221c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	const mpreal operator-() const;
222c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal operator-(const unsigned long int b, const mpreal& a);
223c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal operator-(const unsigned int b, const mpreal& a);
224c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal operator-(const long int b, const mpreal& a);
225c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal operator-(const int b, const mpreal& a);
226c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal operator-(const double b, const mpreal& a);
227c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator-- ();
228c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	const mpreal  operator-- (int);
229c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
230c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// *
231c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator*=(const mpreal& v);
232c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator*=(const mpz_t v);
233c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator*=(const mpq_t v);
234c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator*=(const long double v);
235c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator*=(const double v);
236c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator*=(const unsigned long int v);
237c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator*=(const unsigned int v);
238c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator*=(const long int v);
239c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator*=(const int v);
240c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
241c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// /
242c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator/=(const mpreal& v);
243c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator/=(const mpz_t v);
244c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator/=(const mpq_t v);
245c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator/=(const long double v);
246c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator/=(const double v);
247c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator/=(const unsigned long int v);
248c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator/=(const unsigned int v);
249c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator/=(const long int v);
250c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator/=(const int v);
251c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal operator/(const unsigned long int b, const mpreal& a);
252c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal operator/(const unsigned int b, const mpreal& a);
253c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal operator/(const long int b, const mpreal& a);
254c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal operator/(const int b, const mpreal& a);
255c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal operator/(const double b, const mpreal& a);
256c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
257c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	//<<= Fast Multiplication by 2^u
258c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator<<=(const unsigned long int u);
259c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator<<=(const unsigned int u);
260c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator<<=(const long int u);
261c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator<<=(const int u);
262c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
263c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	//>>= Fast Division by 2^u
264c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator>>=(const unsigned long int u);
265c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator>>=(const unsigned int u);
266c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator>>=(const long int u);
267c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal& operator>>=(const int u);
268c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
269c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// Boolean Operators
270c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend bool operator >  (const mpreal& a, const mpreal& b);
271c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend bool operator >= (const mpreal& a, const mpreal& b);
272c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend bool operator <  (const mpreal& a, const mpreal& b);
273c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend bool operator <= (const mpreal& a, const mpreal& b);
274c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend bool operator == (const mpreal& a, const mpreal& b);
275c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend bool operator != (const mpreal& a, const mpreal& b);
276c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
277c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// Optimized specializations for boolean operators
278c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend bool operator == (const mpreal& a, const unsigned long int b);
279c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend bool operator == (const mpreal& a, const unsigned int b);
280c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend bool operator == (const mpreal& a, const long int b);
281c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend bool operator == (const mpreal& a, const int b);
282c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend bool operator == (const mpreal& a, const long double b);
283c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend bool operator == (const mpreal& a, const double b);
284c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
285c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// Type Conversion operators
286c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	long			toLong()	const;
287c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	unsigned long	toULong()	const;
288c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	double			toDouble()	const;
289c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	long double		toLDouble()	const;
290c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
291c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if defined (MPREAL_HAVE_INT64_SUPPORT)
292c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	int64_t			toInt64()	const;
293c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	uint64_t		toUInt64()	const;
294c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
295c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
296c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// Get raw pointers
297c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	::mpfr_ptr mpfr_ptr();
298c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	::mpfr_srcptr mpfr_srcptr() const;
299c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
300c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// Convert mpreal to string with n significant digits in base b
301c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// n = 0 -> convert with the maximum available digits
302c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	std::string		toString(int n = 0, int b = default_base, mp_rnd_t mode = default_rnd) const;
303c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
304c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0))
305c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	std::string		toString(const std::string& format) const;
306c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
307c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
308c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// Math Functions
309c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal sqr	(const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
310c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal sqrt(const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
311c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal sqrt(const unsigned long int v, mp_rnd_t rnd_mode = mpreal::default_rnd);
312c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal cbrt(const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
313c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal root(const mpreal& v, unsigned long int k, mp_rnd_t rnd_mode = mpreal::default_rnd);
314c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal pow	(const mpreal& a, const mpreal& b, mp_rnd_t rnd_mode = mpreal::default_rnd);
315c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal pow	(const mpreal& a, const mpz_t b, mp_rnd_t rnd_mode = mpreal::default_rnd);
316c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal pow	(const mpreal& a, const unsigned long int b, mp_rnd_t rnd_mode = mpreal::default_rnd);
317c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal pow	(const mpreal& a, const long int b, mp_rnd_t rnd_mode = mpreal::default_rnd);
318c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal pow	(const unsigned long int a, const mpreal& b, mp_rnd_t rnd_mode = mpreal::default_rnd);
319c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal pow	(const unsigned long int a, const unsigned long int b, mp_rnd_t rnd_mode = mpreal::default_rnd);
320c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal fabs(const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
321c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
322c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal abs(const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
323c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal dim(const mpreal& a, const mpreal& b, mp_rnd_t rnd_mode = mpreal::default_rnd);
324c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend inline const mpreal mul_2ui(const mpreal& v, unsigned long int k, mp_rnd_t rnd_mode = mpreal::default_rnd);
325c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend inline const mpreal mul_2si(const mpreal& v, long int k, mp_rnd_t rnd_mode = mpreal::default_rnd);
326c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend inline const mpreal div_2ui(const mpreal& v, unsigned long int k, mp_rnd_t rnd_mode = mpreal::default_rnd);
327c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend inline const mpreal div_2si(const mpreal& v, long int k, mp_rnd_t rnd_mode = mpreal::default_rnd);
328c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend int cmpabs(const mpreal& a,const mpreal& b);
329c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
330c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal log  (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
331c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal log2 (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
332c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal log10(const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
333c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal exp  (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
334c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal exp2 (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
335c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal exp10(const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
336c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal log1p(const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
337c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal expm1(const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
338c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
339c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal cos(const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
340c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal sin(const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
341c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal tan(const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
342c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal sec(const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
343c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal csc(const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
344c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal cot(const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
345c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend int sin_cos(mpreal& s, mpreal& c, const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
346c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
347c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal acos  (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
348c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal asin  (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
349c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal atan  (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
350c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal atan2 (const mpreal& y, const mpreal& x, mp_rnd_t rnd_mode = mpreal::default_rnd);
351c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal acot  (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
352c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal asec  (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
353c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal acsc  (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
354c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
355c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal cosh  (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
356c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal sinh  (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
357c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal tanh  (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
358c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal sech  (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
359c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal csch  (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
360c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal coth  (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
361c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal acosh (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
362c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal asinh (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
363c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal atanh (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
364c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal acoth (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
365c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal asech (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
366c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal acsch (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
367c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
368c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal hypot (const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode = mpreal::default_rnd);
369c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
370c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal fac_ui (unsigned long int v,  mp_prec_t prec = mpreal::default_prec, mp_rnd_t rnd_mode = mpreal::default_rnd);
371c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal eint   (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
372c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
373c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal gamma (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
374c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal lngamma (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
375c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal lgamma (const mpreal& v, int *signp = 0, mp_rnd_t rnd_mode = mpreal::default_rnd);
376c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal zeta (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
377c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal erf (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
378c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal erfc (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
379c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal besselj0 (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
380c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal besselj1 (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
381c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal besseljn (long n, const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
382c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal bessely0 (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
383c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal bessely1 (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
384c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal besselyn (long n, const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
385c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal fma (const mpreal& v1, const mpreal& v2, const mpreal& v3, mp_rnd_t rnd_mode = mpreal::default_rnd);
386c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal fms (const mpreal& v1, const mpreal& v2, const mpreal& v3, mp_rnd_t rnd_mode = mpreal::default_rnd);
387c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal agm (const mpreal& v1, const mpreal& v2, mp_rnd_t rnd_mode = mpreal::default_rnd);
388c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal sum (const mpreal tab[], unsigned long int n, mp_rnd_t rnd_mode = mpreal::default_rnd);
389c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend int sgn(const mpreal& v); // -1 or +1
390c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
391c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// MPFR 2.4.0 Specifics
392c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0))
393c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend int sinh_cosh(mpreal& s, mpreal& c, const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
394c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal li2(const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
395c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal fmod (const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode = mpreal::default_rnd);
396c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal rec_sqrt(const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
397c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
398c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
399c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// MPFR 3.0.0 Specifics
400c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if (MPFR_VERSION >= MPFR_VERSION_NUM(3,0,0))
401c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal digamma(const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
402c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal ai(const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
403c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    friend const mpreal urandom (gmp_randstate_t& state,mp_rnd_t rnd_mode = mpreal::default_rnd); 	// use gmp_randinit_default() to init state, gmp_randclear() to clear
404c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend bool isregular(const mpreal& v);
405c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
406c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
407c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// Uniformly distributed random number generation in [0,1] using
408c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// Mersenne-Twister algorithm by default.
409c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// Use parameter to setup seed, e.g.: random((unsigned)time(NULL))
410c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// Check urandom() for more precise control.
411c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal random(unsigned int seed = 0);
412c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
413c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// Exponent and mantissa manipulation
414c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal frexp(const mpreal& v, mp_exp_t* exp);
415c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal ldexp(const mpreal& v, mp_exp_t exp);
416c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
417c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// Splits mpreal value into fractional and integer parts.
418c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// Returns fractional part and stores integer part in n.
419c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal modf(const mpreal& v, mpreal& n);
420c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
421c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// Constants
422c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// don't forget to call mpfr_free_cache() for every thread where you are using const-functions
423c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal const_log2 (mp_prec_t prec = mpreal::default_prec, mp_rnd_t rnd_mode = mpreal::default_rnd);
424c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal const_pi (mp_prec_t prec = mpreal::default_prec, mp_rnd_t rnd_mode = mpreal::default_rnd);
425c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal const_euler (mp_prec_t prec = mpreal::default_prec, mp_rnd_t rnd_mode = mpreal::default_rnd);
426c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal const_catalan (mp_prec_t prec = mpreal::default_prec, mp_rnd_t rnd_mode = mpreal::default_rnd);
427c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// returns +inf iff sign>=0 otherwise -inf
428c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal const_infinity(int sign = 1, mp_prec_t prec = mpreal::default_prec, mp_rnd_t rnd_mode = mpreal::default_rnd);
429c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
430c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// Output/ Input
431c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend std::ostream& operator<<(std::ostream& os, const mpreal& v);
432c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    friend std::istream& operator>>(std::istream& is, mpreal& v);
433c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
434c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// Integer Related Functions
435c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal rint (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
436c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal ceil (const mpreal& v);
437c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal floor(const mpreal& v);
438c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal round(const mpreal& v);
439c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal trunc(const mpreal& v);
440c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal rint_ceil (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
441c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal rint_floor(const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
442c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal rint_round(const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
443c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal rint_trunc(const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
444c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal frac (const mpreal& v, mp_rnd_t rnd_mode = mpreal::default_rnd);
445c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal remainder (const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode = mpreal::default_rnd);
446c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal remquo (long* q, const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode = mpreal::default_rnd);
447c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
448c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// Miscellaneous Functions
449c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal nexttoward (const mpreal& x, const mpreal& y);
450c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal nextabove  (const mpreal& x);
451c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal nextbelow  (const mpreal& x);
452c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
453c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// use gmp_randinit_default() to init state, gmp_randclear() to clear
454c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal urandomb (gmp_randstate_t& state);
455c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
456c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// MPFR < 2.4.2 Specifics
457c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if (MPFR_VERSION <= MPFR_VERSION_NUM(2,4,2))
458c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal random2 (mp_size_t size, mp_exp_t exp);
459c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
460c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
461c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// Instance Checkers
462c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend bool isnan	(const mpreal& v);
463c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend bool isinf	(const mpreal& v);
464c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend bool isfinite(const mpreal& v);
465c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
466c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend bool isnum(const mpreal& v);
467c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend bool	iszero(const mpreal& v);
468c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend bool isint(const mpreal& v);
469c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
470c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// Set/Get instance properties
471c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	inline mp_prec_t	get_prec() const;
472c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	inline void			set_prec(mp_prec_t prec, mp_rnd_t rnd_mode = default_rnd);	// Change precision with rounding mode
473c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
474c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// Aliases for get_prec(), set_prec() - needed for compatibility with std::complex<mpreal> interface
475c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	inline mpreal&		setPrecision(int Precision, mp_rnd_t RoundingMode = (mpfr_get_default_rounding_mode)());
476c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	inline int			getPrecision() const;
477c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
478c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// Set mpreal to +/- inf, NaN, +/-0
479c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal&		setInf	(int Sign = +1);
480c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal&		setNan	();
481c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal&		setZero	(int Sign = +1);
482c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal&		setSign	(int Sign, mp_rnd_t RoundingMode = (mpfr_get_default_rounding_mode)());
483c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
484c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	//Exponent
485c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mp_exp_t get_exp();
486c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	int set_exp(mp_exp_t e);
487c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	int check_range (int t, mp_rnd_t rnd_mode = default_rnd);
488c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	int subnormalize (int t,mp_rnd_t rnd_mode = default_rnd);
489c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
490c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// Inexact conversion from float
491c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	inline bool fits_in_bits(double x, int n);
492c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
493c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// Set/Get global properties
494c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	static void			set_default_prec(mp_prec_t prec);
495c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	static mp_prec_t	get_default_prec();
496c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	static void			set_default_base(int base);
497c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	static int			get_default_base();
498c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	static void			set_double_bits(int dbits);
499c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	static int			get_double_bits();
500c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	static void			set_default_rnd(mp_rnd_t rnd_mode);
501c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	static mp_rnd_t		get_default_rnd();
502c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	static mp_exp_t		get_emin (void);
503c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	static mp_exp_t		get_emax (void);
504c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	static mp_exp_t		get_emin_min (void);
505c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	static mp_exp_t		get_emin_max (void);
506c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	static mp_exp_t		get_emax_min (void);
507c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	static mp_exp_t		get_emax_max (void);
508c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	static int			set_emin (mp_exp_t exp);
509c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	static int			set_emax (mp_exp_t exp);
510c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
511c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// Efficient swapping of two mpreal values
512c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend void swap(mpreal& x, mpreal& y);
513c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
514c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	//Min Max - macros is evil. Needed for systems which defines max and min globally as macros (e.g. Windows)
515c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	//Hope that globally defined macros use > < operations only
516c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal fmax(const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode = default_rnd);
517c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	friend const mpreal fmin(const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode = default_rnd);
518c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
519c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if defined (MPREAL_HAVE_CUSTOM_MPFR_MALLOC)
520c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
521c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathprivate:
522c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// Optimized dynamic memory allocation/(re-)deallocation.
523c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	static bool is_custom_malloc;
524c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	static void *mpreal_allocate			(size_t alloc_size);
525c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	static void *mpreal_reallocate			(void *ptr, size_t old_size, size_t new_size);
526c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	static void mpreal_free					(void *ptr, size_t size);
527c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	inline static void set_custom_malloc	(void);
528c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
529c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
530c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
531c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
532c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathprivate:
533c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// Human friendly Debug Preview in Visual Studio.
534c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// Put one of these lines:
535c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	//
536c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// mpfr::mpreal=<DebugView>								; Show value only
537c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// mpfr::mpreal=<DebugView>, <mp[0]._mpfr_prec,u>bits	; Show value & precision
538c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	//
539c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// at the beginning of
540c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// [Visual Studio Installation Folder]\Common7\Packages\Debugger\autoexp.dat
541c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_DATA
542c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
543c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
544c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
545c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Exceptions
546c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass conversion_overflow : public std::exception {
547c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathpublic:
548c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	std::string why() { return "inexact conversion from floating point"; }
549c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
550c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
551c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal{
552c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
553c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// Use SFINAE to restrict arithmetic operations instantiation only for numeric types
554c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// This is needed for smooth integration with libraries based on expression templates
555c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	template <typename ArgumentType> struct result_type {};
556c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
557c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	template <> struct result_type<mpreal>				{typedef mpreal type;};
558c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	template <> struct result_type<mpz_t>				{typedef mpreal type;};
559c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	template <> struct result_type<mpq_t>				{typedef mpreal type;};
560c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	template <> struct result_type<long double>			{typedef mpreal type;};
561c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	template <> struct result_type<double>				{typedef mpreal type;};
562c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	template <> struct result_type<unsigned long int>	{typedef mpreal type;};
563c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	template <> struct result_type<unsigned int>		{typedef mpreal type;};
564c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	template <> struct result_type<long int>			{typedef mpreal type;};
565c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	template <> struct result_type<int>					{typedef mpreal type;};
566c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
567c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if defined (MPREAL_HAVE_INT64_SUPPORT)
568c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	template <> struct result_type<int64_t  >			{typedef mpreal type;};
569c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	template <> struct result_type<uint64_t >			{typedef mpreal type;};
570c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
571c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
572c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
573c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// + Addition
574c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename Rhs>
575c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const typename internal::result_type<Rhs>::type
576c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	operator+(const mpreal& lhs, const Rhs& rhs){ return mpreal(lhs) += rhs;	}
577c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
578c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename Lhs>
579c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const typename internal::result_type<Lhs>::type
580c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	operator+(const Lhs& lhs, const mpreal& rhs){ return mpreal(rhs) += lhs;	}
581c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
582c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// - Subtraction
583c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename Rhs>
584c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const typename internal::result_type<Rhs>::type
585c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	operator-(const mpreal& lhs, const Rhs& rhs){ return mpreal(lhs) -= rhs;	}
586c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
587c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename Lhs>
588c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const typename internal::result_type<Lhs>::type
589c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	operator-(const Lhs& lhs, const mpreal& rhs){ return mpreal(lhs) -= rhs;	}
590c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
591c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// * Multiplication
592c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename Rhs>
593c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const typename internal::result_type<Rhs>::type
594c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	operator*(const mpreal& lhs, const Rhs& rhs){ return mpreal(lhs) *= rhs;	}
595c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
596c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename Lhs>
597c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const typename internal::result_type<Lhs>::type
598c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	operator*(const Lhs& lhs, const mpreal& rhs){ return mpreal(rhs) *= lhs;	}
599c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
600c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// / Division
601c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename Rhs>
602c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const typename internal::result_type<Rhs>::type
603c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	operator/(const mpreal& lhs, const Rhs& rhs){ return mpreal(lhs) /= rhs;	}
604c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
605c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename Lhs>
606c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const typename internal::result_type<Lhs>::type
607c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	operator/(const Lhs& lhs, const mpreal& rhs){ return mpreal(lhs) /= rhs;	}
608c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
609c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
610c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// sqrt
611c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal sqrt(const unsigned int v, mp_rnd_t rnd_mode = mpreal::default_rnd);
612c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal sqrt(const long int v, mp_rnd_t rnd_mode = mpreal::default_rnd);
613c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal sqrt(const int v, mp_rnd_t rnd_mode = mpreal::default_rnd);
614c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal sqrt(const long double v, mp_rnd_t rnd_mode = mpreal::default_rnd);
615c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal sqrt(const double v, mp_rnd_t rnd_mode = mpreal::default_rnd);
616c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
617c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
618c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// pow
619c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal pow(const mpreal& a, const unsigned int b, mp_rnd_t rnd_mode = mpreal::default_rnd);
620c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal pow(const mpreal& a, const int b, mp_rnd_t rnd_mode = mpreal::default_rnd);
621c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal pow(const mpreal& a, const long double b, mp_rnd_t rnd_mode = mpreal::default_rnd);
622c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal pow(const mpreal& a, const double b, mp_rnd_t rnd_mode = mpreal::default_rnd);
623c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
624c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal pow(const unsigned int a, const mpreal& b, mp_rnd_t rnd_mode = mpreal::default_rnd);
625c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal pow(const long int a, const mpreal& b, mp_rnd_t rnd_mode = mpreal::default_rnd);
626c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal pow(const int a, const mpreal& b, mp_rnd_t rnd_mode = mpreal::default_rnd);
627c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal pow(const long double a, const mpreal& b, mp_rnd_t rnd_mode = mpreal::default_rnd);
628c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal pow(const double a, const mpreal& b, mp_rnd_t rnd_mode = mpreal::default_rnd);
629c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
630c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal pow(const unsigned long int a, const unsigned int b, mp_rnd_t rnd_mode = mpreal::default_rnd);
631c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal pow(const unsigned long int a, const long int b, mp_rnd_t rnd_mode = mpreal::default_rnd);
632c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal pow(const unsigned long int a, const int b, mp_rnd_t rnd_mode = mpreal::default_rnd);
633c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal pow(const unsigned long int a, const long double b, mp_rnd_t rnd_mode = mpreal::default_rnd);
634c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal pow(const unsigned long int a, const double b, mp_rnd_t rnd_mode = mpreal::default_rnd);
635c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
636c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal pow(const unsigned int a, const unsigned long int b, mp_rnd_t rnd_mode = mpreal::default_rnd);
637c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal pow(const unsigned int a, const unsigned int b, mp_rnd_t rnd_mode = mpreal::default_rnd);
638c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal pow(const unsigned int a, const long int b, mp_rnd_t rnd_mode = mpreal::default_rnd);
639c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal pow(const unsigned int a, const int b, mp_rnd_t rnd_mode = mpreal::default_rnd);
640c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal pow(const unsigned int a, const long double b, mp_rnd_t rnd_mode = mpreal::default_rnd);
641c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal pow(const unsigned int a, const double b, mp_rnd_t rnd_mode = mpreal::default_rnd);
642c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
643c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal pow(const long int a, const unsigned long int b, mp_rnd_t rnd_mode = mpreal::default_rnd);
644c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal pow(const long int a, const unsigned int b, mp_rnd_t rnd_mode = mpreal::default_rnd);
645c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal pow(const long int a, const long int b, mp_rnd_t rnd_mode = mpreal::default_rnd);
646c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal pow(const long int a, const int b, mp_rnd_t rnd_mode = mpreal::default_rnd);
647c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal pow(const long int a, const long double b, mp_rnd_t rnd_mode = mpreal::default_rnd);
648c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal pow(const long int a, const double b, mp_rnd_t rnd_mode = mpreal::default_rnd);
649c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
650c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal pow(const int a, const unsigned long int b, mp_rnd_t rnd_mode = mpreal::default_rnd);
651c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal pow(const int a, const unsigned int b, mp_rnd_t rnd_mode = mpreal::default_rnd);
652c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal pow(const int a, const long int b, mp_rnd_t rnd_mode = mpreal::default_rnd);
653c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal pow(const int a, const int b, mp_rnd_t rnd_mode = mpreal::default_rnd);
654c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal pow(const int a, const long double b, mp_rnd_t rnd_mode = mpreal::default_rnd);
655c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal pow(const int a, const double b, mp_rnd_t rnd_mode = mpreal::default_rnd);
656c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
657c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal pow(const long double a, const long double b, mp_rnd_t rnd_mode = mpreal::default_rnd);
658c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal pow(const long double a, const unsigned long int b, mp_rnd_t rnd_mode = mpreal::default_rnd);
659c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal pow(const long double a, const unsigned int b, mp_rnd_t rnd_mode = mpreal::default_rnd);
660c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal pow(const long double a, const long int b, mp_rnd_t rnd_mode = mpreal::default_rnd);
661c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal pow(const long double a, const int b, mp_rnd_t rnd_mode = mpreal::default_rnd);
662c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
663c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal pow(const double a, const double b, mp_rnd_t rnd_mode = mpreal::default_rnd);
664c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal pow(const double a, const unsigned long int b, mp_rnd_t rnd_mode = mpreal::default_rnd);
665c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal pow(const double a, const unsigned int b, mp_rnd_t rnd_mode = mpreal::default_rnd);
666c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal pow(const double a, const long int b, mp_rnd_t rnd_mode = mpreal::default_rnd);
667c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal pow(const double a, const int b, mp_rnd_t rnd_mode = mpreal::default_rnd);
668c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
669c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
670c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Estimate machine epsilon for the given precision
671c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Returns smallest eps such that 1.0 + eps != 1.0
672c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal machine_epsilon(mp_prec_t prec = mpreal::get_default_prec());
673c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
674c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//  Returns the positive distance from abs(x) to the next larger in magnitude floating point number of the same precision as x
675c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal machine_epsilon(const mpreal& x);
676c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
677c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal mpreal_min(mp_prec_t prec = mpreal::get_default_prec());
678c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal mpreal_max(mp_prec_t prec = mpreal::get_default_prec());
679c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline bool isEqualFuzzy(const mpreal& a, const mpreal& b, const mpreal& eps);
680c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline bool isEqualUlps(const mpreal& a, const mpreal& b, int maxUlps);
681c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
682c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
683c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 	Bits - decimal digits relation
684c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//		bits   = ceil(digits*log[2](10))
685c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//		digits = floor(bits*log[10](2))
686c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
687c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mp_prec_t digits2bits(int d);
688c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline int bits2digits(mp_prec_t b);
689c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
690c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
691c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// min, max
692c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal (max)(const mpreal& x, const mpreal& y);
693c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst mpreal (min)(const mpreal& x, const mpreal& y);
694c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
695c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
696c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Implementation
697c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
698c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
699c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
700c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Operators - Assignment
701c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator=(const mpreal& v)
702c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
703c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	if (this != &v)
704c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	{
705c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath		mpfr_clear(mp);
706c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath		mpfr_init2(mp,mpfr_get_prec(v.mp));
707c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath		mpfr_set(mp,v.mp,default_rnd);
708c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
709c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath		MPREAL_MSVC_DEBUGVIEW_CODE;
710c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	}
711c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
712c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
713c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
714c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator=(const mpf_t v)
715c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
716c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_set_f(mp,v,default_rnd);
717c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
718c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
719c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
720c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
721c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
722c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator=(const mpz_t v)
723c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
724c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_set_z(mp,v,default_rnd);
725c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
726c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
727c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
728c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
729c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
730c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator=(const mpq_t v)
731c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
732c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_set_q(mp,v,default_rnd);
733c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
734c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
735c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
736c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
737c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
738c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator=(const long double v)
739c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
740c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    mpfr_set_ld(mp,v,default_rnd);
741c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
742c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
743c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
744c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
745c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
746c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator=(const double v)
747c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
748c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    if(double_bits == -1 || fits_in_bits(v, double_bits))
749c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
750c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    	mpfr_set_d(mp,v,default_rnd);
751c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
752c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath		MPREAL_MSVC_DEBUGVIEW_CODE;
753c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
754c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    else
755c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        throw conversion_overflow();
756c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
757c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
758c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
759c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
760c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator=(const unsigned long int v)
761c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
762c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_set_ui(mp,v,default_rnd);
763c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
764c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
765c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
766c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
767c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
768c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator=(const unsigned int v)
769c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
770c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_set_ui(mp,v,default_rnd);
771c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
772c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
773c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
774c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
775c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
776c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator=(const long int v)
777c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
778c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_set_si(mp,v,default_rnd);
779c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
780c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
781c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
782c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
783c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
784c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator=(const int v)
785c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
786c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_set_si(mp,v,default_rnd);
787c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
788c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
789c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
790c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
791c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
792c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
793c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// + Addition
794c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator+=(const mpreal& v)
795c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
796c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_add(mp,mp,v.mp,default_rnd);
797c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
798c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
799c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
800c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
801c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator+=(const mpf_t u)
802c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
803c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	*this += mpreal(u);
804c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
805c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
806c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
807c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
808c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator+=(const mpz_t u)
809c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
810c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_add_z(mp,mp,u,default_rnd);
811c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
812c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
813c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
814c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
815c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator+=(const mpq_t u)
816c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
817c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_add_q(mp,mp,u,default_rnd);
818c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
819c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
820c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
821c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
822c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator+= (const long double u)
823c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
824c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	*this += mpreal(u);
825c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
826c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
827c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
828c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
829c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator+= (const double u)
830c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
831c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0))
832c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_add_d(mp,mp,u,default_rnd);
833c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#else
834c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	*this += mpreal(u);
835c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
836c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
837c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
838c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
839c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
840c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
841c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator+=(const unsigned long int u)
842c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
843c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_add_ui(mp,mp,u,default_rnd);
844c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
845c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
846c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
847c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
848c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator+=(const unsigned int u)
849c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
850c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_add_ui(mp,mp,u,default_rnd);
851c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
852c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
853c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
854c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
855c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator+=(const long int u)
856c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
857c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_add_si(mp,mp,u,default_rnd);
858c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
859c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
860c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
861c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
862c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator+=(const int u)
863c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
864c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_add_si(mp,mp,u,default_rnd);
865c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
866c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
867c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
868c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
869c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if defined (MPREAL_HAVE_INT64_SUPPORT)
870c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator+=(const int64_t  u){	*this += mpreal(u); MPREAL_MSVC_DEBUGVIEW_CODE; return *this;	}
871c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator+=(const uint64_t u){	*this += mpreal(u); MPREAL_MSVC_DEBUGVIEW_CODE; return *this;	}
872c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator-=(const int64_t  u){	*this -= mpreal(u); MPREAL_MSVC_DEBUGVIEW_CODE; return *this;	}
873c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator-=(const uint64_t u){	*this -= mpreal(u); MPREAL_MSVC_DEBUGVIEW_CODE; return *this;	}
874c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator*=(const int64_t  u){	*this *= mpreal(u); MPREAL_MSVC_DEBUGVIEW_CODE; return *this;	}
875c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator*=(const uint64_t u){	*this *= mpreal(u); MPREAL_MSVC_DEBUGVIEW_CODE; return *this;	}
876c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator/=(const int64_t  u){	*this /= mpreal(u); MPREAL_MSVC_DEBUGVIEW_CODE; return *this;	}
877c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator/=(const uint64_t u){	*this /= mpreal(u); MPREAL_MSVC_DEBUGVIEW_CODE; return *this;	}
878c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
879c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
880c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal mpreal::operator+()const	{	return mpreal(*this); }
881c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
882c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal operator+(const mpreal& a, const mpreal& b)
883c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
884c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// prec(a+b) = max(prec(a),prec(b))
885c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	if(a.get_prec()>b.get_prec()) return mpreal(a) += b;
886c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	else						  return mpreal(b) += a;
887c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
888c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
889c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator++()
890c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
891c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this += 1;
892c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
893c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
894c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal mpreal::operator++ (int)
895c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
896c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(*this);
897c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	*this += 1;
898c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
899c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
900c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
901c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator--()
902c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
903c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this -= 1;
904c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
905c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
906c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal mpreal::operator-- (int)
907c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
908c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(*this);
909c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	*this -= 1;
910c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
911c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
912c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
913c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
914c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// - Subtraction
915c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator-= (const mpreal& v)
916c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
917c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_sub(mp,mp,v.mp,default_rnd);
918c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
919c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
920c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
921c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
922c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator-=(const mpz_t v)
923c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
924c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_sub_z(mp,mp,v,default_rnd);
925c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
926c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
927c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
928c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
929c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator-=(const mpq_t v)
930c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
931c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_sub_q(mp,mp,v,default_rnd);
932c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
933c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
934c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
935c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
936c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator-=(const long double v)
937c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
938c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	*this -= mpreal(v);
939c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
940c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
941c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
942c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
943c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator-=(const double v)
944c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
945c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0))
946c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_sub_d(mp,mp,v,default_rnd);
947c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#else
948c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	*this -= mpreal(v);
949c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
950c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
951c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
952c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
953c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
954c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
955c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator-=(const unsigned long int v)
956c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
957c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_sub_ui(mp,mp,v,default_rnd);
958c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
959c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
960c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
961c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
962c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator-=(const unsigned int v)
963c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
964c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_sub_ui(mp,mp,v,default_rnd);
965c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
966c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
967c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
968c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
969c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator-=(const long int v)
970c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
971c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_sub_si(mp,mp,v,default_rnd);
972c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
973c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
974c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
975c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
976c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator-=(const int v)
977c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
978c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_sub_si(mp,mp,v,default_rnd);
979c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
980c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
981c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
982c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
983c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal mpreal::operator-()const
984c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
985c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal u(*this);
986c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_neg(u.mp,u.mp,default_rnd);
987c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return u;
988c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
989c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
990c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal operator-(const mpreal& a, const mpreal& b)
991c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
992c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// prec(a-b) = max(prec(a),prec(b))
993c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	if(a.getPrecision() >= b.getPrecision())
994c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	{
995c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath		return   mpreal(a) -= b;
996c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	}else{
997c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath		mpreal x(a);
998c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath		x.setPrecision(b.getPrecision());
999c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath		return x -= b;
1000c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	}
1001c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1002c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1003c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal operator-(const double  b, const mpreal& a)
1004c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1005c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0))
1006c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(a);
1007c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_d_sub(x.mp,b,a.mp,mpreal::default_rnd);
1008c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1009c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#else
1010c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return mpreal(b) -= a;
1011c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
1012c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1013c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1014c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal operator-(const unsigned long int b, const mpreal& a)
1015c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1016c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(a);
1017c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_ui_sub(x.mp,b,a.mp,mpreal::default_rnd);
1018c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1019c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1020c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1021c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal operator-(const unsigned int b, const mpreal& a)
1022c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1023c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(a);
1024c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_ui_sub(x.mp,b,a.mp,mpreal::default_rnd);
1025c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1026c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1027c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1028c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal operator-(const long int b, const mpreal& a)
1029c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1030c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(a);
1031c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_si_sub(x.mp,b,a.mp,mpreal::default_rnd);
1032c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1033c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1034c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1035c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal operator-(const int b, const mpreal& a)
1036c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1037c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(a);
1038c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_si_sub(x.mp,b,a.mp,mpreal::default_rnd);
1039c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1040c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1041c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1042c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
1043c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// * Multiplication
1044c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator*= (const mpreal& v)
1045c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1046c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_mul(mp,mp,v.mp,default_rnd);
1047c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
1048c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
1049c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1050c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1051c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator*=(const mpz_t v)
1052c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1053c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_mul_z(mp,mp,v,default_rnd);
1054c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
1055c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
1056c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1057c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1058c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator*=(const mpq_t v)
1059c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1060c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_mul_q(mp,mp,v,default_rnd);
1061c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
1062c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
1063c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1064c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1065c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator*=(const long double v)
1066c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1067c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	*this *= mpreal(v);
1068c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
1069c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
1070c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1071c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1072c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator*=(const double v)
1073c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1074c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0))
1075c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_mul_d(mp,mp,v,default_rnd);
1076c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#else
1077c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	*this *= mpreal(v);
1078c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
1079c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1080c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
1081c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
1082c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1083c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1084c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator*=(const unsigned long int v)
1085c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1086c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_mul_ui(mp,mp,v,default_rnd);
1087c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
1088c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
1089c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1090c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1091c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator*=(const unsigned int v)
1092c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1093c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_mul_ui(mp,mp,v,default_rnd);
1094c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
1095c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
1096c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1097c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1098c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator*=(const long int v)
1099c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_mul_si(mp,mp,v,default_rnd);
1101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
1102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
1103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator*=(const int v)
1106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_mul_si(mp,mp,v,default_rnd);
1108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
1109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
1110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal operator*(const mpreal& a, const mpreal& b)
1113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// prec(a*b) = max(prec(a),prec(b))
1115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	if(a.getPrecision() >= b.getPrecision())	return   mpreal(a) *= b;
1116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	else										return   mpreal(b) *= a;
1117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
1120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// / Division
1121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator/=(const mpreal& v)
1122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_div(mp,mp,v.mp,default_rnd);
1124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
1125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
1126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator/=(const mpz_t v)
1129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_div_z(mp,mp,v,default_rnd);
1131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
1132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
1133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator/=(const mpq_t v)
1136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_div_q(mp,mp,v,default_rnd);
1138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
1139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
1140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator/=(const long double v)
1143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	*this /= mpreal(v);
1145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
1146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
1147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator/=(const double v)
1150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0))
1152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_div_d(mp,mp,v,default_rnd);
1153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#else
1154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	*this /= mpreal(v);
1155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
1156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
1157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
1158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator/=(const unsigned long int v)
1161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_div_ui(mp,mp,v,default_rnd);
1163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
1164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
1165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator/=(const unsigned int v)
1168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_div_ui(mp,mp,v,default_rnd);
1170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
1171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
1172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator/=(const long int v)
1175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_div_si(mp,mp,v,default_rnd);
1177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
1178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
1179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator/=(const int v)
1182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_div_si(mp,mp,v,default_rnd);
1184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
1185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
1186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal operator/(const mpreal& a, const mpreal& b)
1189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1190c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// prec(a/b) = max(prec(a),prec(b))
1191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	if(a.getPrecision() >= b.getPrecision())
1192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	{
1193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath		return   mpreal(a) /= b;
1194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	}else{
1195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath		mpreal x(a);
1197c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath		x.setPrecision(b.getPrecision());
1198c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath		return x /= b;
1199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	}
1200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal operator/(const unsigned long int b, const mpreal& a)
1203c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(a);
1205c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_ui_div(x.mp,b,a.mp,mpreal::default_rnd);
1206c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1207c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1208c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1209c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal operator/(const unsigned int b, const mpreal& a)
1210c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1211c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(a);
1212c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_ui_div(x.mp,b,a.mp,mpreal::default_rnd);
1213c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1214c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1215c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1216c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal operator/(const long int b, const mpreal& a)
1217c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1218c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(a);
1219c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_si_div(x.mp,b,a.mp,mpreal::default_rnd);
1220c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1221c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1222c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1223c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal operator/(const int b, const mpreal& a)
1224c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1225c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(a);
1226c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_si_div(x.mp,b,a.mp,mpreal::default_rnd);
1227c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1228c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1229c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1230c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal operator/(const double  b, const mpreal& a)
1231c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1232c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0))
1233c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(a);
1234c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_d_div(x.mp,b,a.mp,mpreal::default_rnd);
1235c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1236c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#else
1237c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return mpreal(b) /= a;
1238c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
1239c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1240c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1241c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
1242c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Shifts operators - Multiplication/Division by power of 2
1243c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator<<=(const unsigned long int u)
1244c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1245c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_mul_2ui(mp,mp,u,default_rnd);
1246c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
1247c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
1248c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1249c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1250c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator<<=(const unsigned int u)
1251c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1252c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_mul_2ui(mp,mp,static_cast<unsigned long int>(u),default_rnd);
1253c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
1254c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
1255c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1256c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1257c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator<<=(const long int u)
1258c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1259c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_mul_2si(mp,mp,u,default_rnd);
1260c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
1261c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
1262c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1263c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1264c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator<<=(const int u)
1265c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1266c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_mul_2si(mp,mp,static_cast<long int>(u),default_rnd);
1267c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
1268c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
1269c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1270c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1271c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator>>=(const unsigned long int u)
1272c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1273c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_div_2ui(mp,mp,u,default_rnd);
1274c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
1275c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
1276c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1277c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1278c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator>>=(const unsigned int u)
1279c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1280c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_div_2ui(mp,mp,static_cast<unsigned long int>(u),default_rnd);
1281c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
1282c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
1283c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1284c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1285c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator>>=(const long int u)
1286c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1287c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_div_2si(mp,mp,u,default_rnd);
1288c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
1289c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
1290c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1291c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1292c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::operator>>=(const int u)
1293c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1294c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_div_2si(mp,mp,static_cast<long int>(u),default_rnd);
1295c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
1296c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
1297c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1298c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1299c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal operator<<(const mpreal& v, const unsigned long int k)
1300c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1301c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return mul_2ui(v,k);
1302c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1303c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1304c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal operator<<(const mpreal& v, const unsigned int k)
1305c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1306c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return mul_2ui(v,static_cast<unsigned long int>(k));
1307c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1308c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1309c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal operator<<(const mpreal& v, const long int k)
1310c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1311c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return mul_2si(v,k);
1312c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1313c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1314c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal operator<<(const mpreal& v, const int k)
1315c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1316c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return mul_2si(v,static_cast<long int>(k));
1317c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1318c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1319c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal operator>>(const mpreal& v, const unsigned long int k)
1320c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1321c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return div_2ui(v,k);
1322c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1323c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1324c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal operator>>(const mpreal& v, const long int k)
1325c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1326c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return div_2si(v,k);
1327c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1328c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1329c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal operator>>(const mpreal& v, const unsigned int k)
1330c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1331c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return div_2ui(v,static_cast<unsigned long int>(k));
1332c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1333c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1334c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal operator>>(const mpreal& v, const int k)
1335c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1336c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return div_2si(v,static_cast<long int>(k));
1337c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1338c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1339c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// mul_2ui
1340c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal mul_2ui(const mpreal& v, unsigned long int k, mp_rnd_t rnd_mode)
1341c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1342c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
1343c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_mul_2ui(x.mp,v.mp,k,rnd_mode);
1344c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1345c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1346c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1347c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// mul_2si
1348c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal mul_2si(const mpreal& v, long int k, mp_rnd_t rnd_mode)
1349c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1350c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
1351c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_mul_2si(x.mp,v.mp,k,rnd_mode);
1352c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1353c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1354c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1355c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal div_2ui(const mpreal& v, unsigned long int k, mp_rnd_t rnd_mode)
1356c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1357c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
1358c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_div_2ui(x.mp,v.mp,k,rnd_mode);
1359c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1360c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1361c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1362c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal div_2si(const mpreal& v, long int k, mp_rnd_t rnd_mode)
1363c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1364c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
1365c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_div_2si(x.mp,v.mp,k,rnd_mode);
1366c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1367c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1368c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1369c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
1370c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//Boolean operators
1371c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline bool operator >	(const mpreal& a, const mpreal& b){	return (mpfr_greater_p(a.mp,b.mp)		!=0);	}
1372c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline bool operator >= (const mpreal& a, const mpreal& b){	return (mpfr_greaterequal_p(a.mp,b.mp)	!=0);	}
1373c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline bool operator <  (const mpreal& a, const mpreal& b){	return (mpfr_less_p(a.mp,b.mp)			!=0);	}
1374c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline bool operator <= (const mpreal& a, const mpreal& b){	return (mpfr_lessequal_p(a.mp,b.mp)		!=0);	}
1375c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline bool operator == (const mpreal& a, const mpreal& b){	return (mpfr_equal_p(a.mp,b.mp)			!=0);	}
1376c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline bool operator != (const mpreal& a, const mpreal& b){	return (mpfr_lessgreater_p(a.mp,b.mp)	!=0);	}
1377c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1378c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline bool operator == (const mpreal& a, const unsigned long int b	){	return (mpfr_cmp_ui(a.mp,b) == 0);	}
1379c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline bool operator == (const mpreal& a, const unsigned int b		){	return (mpfr_cmp_ui(a.mp,b) == 0);	}
1380c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline bool operator == (const mpreal& a, const long int b			){	return (mpfr_cmp_si(a.mp,b) == 0);	}
1381c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline bool operator == (const mpreal& a, const int b				){	return (mpfr_cmp_si(a.mp,b) == 0);	}
1382c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline bool operator == (const mpreal& a, const long double b		){	return (mpfr_cmp_ld(a.mp,b) == 0);	}
1383c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline bool operator == (const mpreal& a, const double b			){	return (mpfr_cmp_d(a.mp,b)  == 0);	}
1384c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1385c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1386c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline bool isnan	(const mpreal& v){	return (mpfr_nan_p(v.mp)		!= 0);	}
1387c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline bool isinf	(const mpreal& v){	return (mpfr_inf_p(v.mp)		!= 0);	}
1388c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline bool isfinite(const mpreal& v){	return (mpfr_number_p(v.mp)		!= 0);	}
1389c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline bool iszero	(const mpreal& v){	return (mpfr_zero_p(v.mp)		!= 0);	}
1390c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline bool isint	(const mpreal& v){	return (mpfr_integer_p(v.mp)	!= 0);	}
1391c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1392c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if (MPFR_VERSION >= MPFR_VERSION_NUM(3,0,0))
1393c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline bool isregular(const mpreal& v){	return (mpfr_regular_p(v.mp));}
1394c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
1395c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1396c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
1397c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Type Converters
1398c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline long				mpreal::toLong()	const	{	return mpfr_get_si(mp,GMP_RNDZ);	}
1399c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline unsigned long	mpreal::toULong()	const	{	return mpfr_get_ui(mp,GMP_RNDZ);	}
1400c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline double			mpreal::toDouble()	const	{	return mpfr_get_d(mp,default_rnd);	}
1401c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline long double		mpreal::toLDouble()	const	{	return mpfr_get_ld(mp,default_rnd);	}
1402c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1403c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if defined (MPREAL_HAVE_INT64_SUPPORT)
1404c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline int64_t	 mpreal::toInt64()	const{	return mpfr_get_sj(mp,GMP_RNDZ);	}
1405c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline uint64_t	 mpreal::toUInt64()	const{	return mpfr_get_uj(mp,GMP_RNDZ);	}
1406c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
1407c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1408c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline ::mpfr_ptr		mpreal::mpfr_ptr()			{	return mp;	}
1409c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline ::mpfr_srcptr	mpreal::mpfr_srcptr() const	{	return const_cast< ::mpfr_srcptr >(mp);	}
1410c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1411c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
1412c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 	Bits - decimal digits relation
1413c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//		bits   = ceil(digits*log[2](10))
1414c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//		digits = floor(bits*log[10](2))
1415c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1416c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mp_prec_t digits2bits(int d)
1417c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1418c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	const double LOG2_10 = 3.3219280948873624;
1419c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1420c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	d = 10>d?10:d;
1421c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1422c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return (mp_prec_t)std::ceil((d)*LOG2_10);
1423c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1424c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1425c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline int bits2digits(mp_prec_t b)
1426c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1427c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	const double LOG10_2 = 0.30102999566398119;
1428c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1429c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	b = 34>b?34:b;
1430c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1431c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return (int)std::floor((b)*LOG10_2);
1432c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1433c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1434c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
1435c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Set/Get number properties
1436c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline int sgn(const mpreal& v)
1437c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1438c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	int r = mpfr_signbit(v.mp);
1439c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return (r>0?-1:1);
1440c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1441c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1442c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::setSign(int sign, mp_rnd_t RoundingMode)
1443c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1444c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_setsign(mp,mp,(sign<0?1:0),RoundingMode);
1445c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
1446c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
1447c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1448c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1449c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline int mpreal::getPrecision() const
1450c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1451c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return mpfr_get_prec(mp);
1452c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1453c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1454c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::setPrecision(int Precision, mp_rnd_t RoundingMode)
1455c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1456c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_prec_round(mp,Precision, RoundingMode);
1457c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
1458c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
1459c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1460c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1461c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::setInf(int sign)
1462c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1463c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_set_inf(mp,sign);
1464c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
1465c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
1466c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1467c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1468c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal& mpreal::setNan()
1469c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1470c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_set_nan(mp);
1471c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
1472c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
1473c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1474c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1475c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mpreal&	mpreal::setZero(int sign)
1476c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1477c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_set_zero(mp,sign);
1478c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
1479c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return *this;
1480c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1481c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1482c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mp_prec_t mpreal::get_prec() const
1483c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1484c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return mpfr_get_prec(mp);
1485c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1486c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1487c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline void mpreal::set_prec(mp_prec_t prec, mp_rnd_t rnd_mode)
1488c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1489c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_prec_round(mp,prec,rnd_mode);
1490c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
1491c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1492c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1493c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mp_exp_t mpreal::get_exp ()
1494c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1495c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return mpfr_get_exp(mp);
1496c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1497c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1498c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline int mpreal::set_exp (mp_exp_t e)
1499c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1500c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	int x = mpfr_set_exp(mp, e);
1501c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
1502c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1503c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1504c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1505c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal frexp(const mpreal& v, mp_exp_t* exp)
1506c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1507c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
1508c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	*exp = x.get_exp();
1509c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	x.set_exp(0);
1510c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1511c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1512c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1513c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal ldexp(const mpreal& v, mp_exp_t exp)
1514c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1515c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
1516c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1517c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// rounding is not important since we just increasing the exponent
1518c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_mul_2si(x.mp,x.mp,exp,mpreal::default_rnd);
1519c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1520c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1521c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1522c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal machine_epsilon(mp_prec_t prec)
1523c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1524c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// the smallest eps such that 1.0+eps != 1.0
1525c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// depends (of cause) on the precision
1526c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return machine_epsilon(mpreal(1,prec));
1527c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1528c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1529c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal machine_epsilon(const mpreal& x)
1530c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1531c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	if( x < 0)
1532c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	{
1533c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath		return nextabove(-x)+x;
1534c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	}else{
1535c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath		return nextabove(x)-x;
1536c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	}
1537c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1538c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1539c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal mpreal_min(mp_prec_t prec)
1540c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1541c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// min = 1/2*2^emin = 2^(emin-1)
1542c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1543c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return mpreal(1,prec) << mpreal::get_emin()-1;
1544c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1545c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1546c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal mpreal_max(mp_prec_t prec)
1547c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1548c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// max = (1-eps)*2^emax, assume eps = 0?,
1549c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// and use emax-1 to prevent value to be +inf
1550c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// max = 2^(emax-1)
1551c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1552c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return mpreal(1,prec) << mpreal::get_emax()-1;
1553c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1554c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1555c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline bool isEqualUlps(const mpreal& a, const mpreal& b, int maxUlps)
1556c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1557c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  /*
1558c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   maxUlps - a and b can be apart by maxUlps binary numbers.
1559c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
1560c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return abs(a - b) <= machine_epsilon((max)(abs(a), abs(b))) * maxUlps;
1561c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1562c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1563c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline bool isEqualFuzzy(const mpreal& a, const mpreal& b, const mpreal& eps)
1564c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1565c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return abs(a - b) <= (min)(abs(a), abs(b)) * eps;
1566c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1567c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1568c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline bool isEqualFuzzy(const mpreal& a, const mpreal& b)
1569c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1570c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return isEqualFuzzy(a,b,machine_epsilon((std::min)(abs(a), abs(b))));
1571c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1572c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1573c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal modf(const mpreal& v, mpreal& n)
1574c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1575c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal frac(v);
1576c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1577c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// rounding is not important since we are using the same number
1578c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_frac(frac.mp,frac.mp,mpreal::default_rnd);
1579c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_trunc(n.mp,v.mp);
1580c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return frac;
1581c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1582c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1583c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline int mpreal::check_range (int t, mp_rnd_t rnd_mode)
1584c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1585c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return mpfr_check_range(mp,t,rnd_mode);
1586c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1587c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1588c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline int mpreal::subnormalize (int t,mp_rnd_t rnd_mode)
1589c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1590c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	int r = mpfr_subnormalize(mp,t,rnd_mode);
1591c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	MPREAL_MSVC_DEBUGVIEW_CODE;
1592c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return r;
1593c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1594c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1595c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mp_exp_t mpreal::get_emin (void)
1596c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1597c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return mpfr_get_emin();
1598c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1599c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1600c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline int mpreal::set_emin (mp_exp_t exp)
1601c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1602c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return mpfr_set_emin(exp);
1603c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1604c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1605c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mp_exp_t mpreal::get_emax (void)
1606c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1607c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return mpfr_get_emax();
1608c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1609c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1610c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline int mpreal::set_emax (mp_exp_t exp)
1611c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1612c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return mpfr_set_emax(exp);
1613c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1614c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1615c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mp_exp_t mpreal::get_emin_min (void)
1616c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1617c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return mpfr_get_emin_min();
1618c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1619c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1620c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mp_exp_t mpreal::get_emin_max (void)
1621c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1622c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return mpfr_get_emin_max();
1623c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1624c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1625c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mp_exp_t mpreal::get_emax_min (void)
1626c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1627c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return mpfr_get_emax_min();
1628c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1629c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1630c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mp_exp_t mpreal::get_emax_max (void)
1631c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1632c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return mpfr_get_emax_max();
1633c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1634c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1635c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
1636c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Mathematical Functions
1637c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
1638c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal sqr(const mpreal& v, mp_rnd_t rnd_mode)
1639c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1640c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
1641c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_sqr(x.mp,x.mp,rnd_mode);
1642c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1643c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1644c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1645c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal sqrt(const mpreal& v, mp_rnd_t rnd_mode)
1646c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1647c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
1648c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_sqrt(x.mp,x.mp,rnd_mode);
1649c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1650c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1651c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1652c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal sqrt(const unsigned long int v, mp_rnd_t rnd_mode)
1653c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1654c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x;
1655c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_sqrt_ui(x.mp,v,rnd_mode);
1656c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1657c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1658c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1659c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal sqrt(const unsigned int v, mp_rnd_t rnd_mode)
1660c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1661c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return sqrt(static_cast<unsigned long int>(v),rnd_mode);
1662c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1663c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1664c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal sqrt(const long int v, mp_rnd_t rnd_mode)
1665c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1666c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	if (v>=0)	return sqrt(static_cast<unsigned long int>(v),rnd_mode);
1667c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	else		return mpreal().setNan(); // NaN
1668c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1669c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1670c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal sqrt(const int v, mp_rnd_t rnd_mode)
1671c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1672c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	if (v>=0)	return sqrt(static_cast<unsigned long int>(v),rnd_mode);
1673c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	else		return mpreal().setNan(); // NaN
1674c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1675c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1676c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal sqrt(const long double v, mp_rnd_t rnd_mode)
1677c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1678c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return sqrt(mpreal(v),rnd_mode);
1679c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1680c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1681c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal sqrt(const double v, mp_rnd_t rnd_mode)
1682c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1683c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return sqrt(mpreal(v),rnd_mode);
1684c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1685c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1686c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal cbrt(const mpreal& v, mp_rnd_t rnd_mode)
1687c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1688c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
1689c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_cbrt(x.mp,x.mp,rnd_mode);
1690c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1691c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1692c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1693c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal root(const mpreal& v, unsigned long int k, mp_rnd_t rnd_mode)
1694c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1695c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
1696c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_root(x.mp,x.mp,k,rnd_mode);
1697c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1698c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1699c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1700c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal fabs(const mpreal& v, mp_rnd_t rnd_mode)
1701c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1702c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
1703c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_abs(x.mp,x.mp,rnd_mode);
1704c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1705c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1706c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1707c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal abs(const mpreal& v, mp_rnd_t rnd_mode)
1708c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1709c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
1710c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_abs(x.mp,x.mp,rnd_mode);
1711c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1712c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1713c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1714c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal dim(const mpreal& a, const mpreal& b, mp_rnd_t rnd_mode)
1715c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1716c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(a);
1717c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_dim(x.mp,a.mp,b.mp,rnd_mode);
1718c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1719c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1720c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1721c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline int cmpabs(const mpreal& a,const mpreal& b)
1722c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1723c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return mpfr_cmpabs(a.mp,b.mp);
1724c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1725c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1726c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal log  (const mpreal& v, mp_rnd_t rnd_mode)
1727c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1728c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
1729c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_log(x.mp,v.mp,rnd_mode);
1730c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1731c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1732c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1733c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal log2(const mpreal& v, mp_rnd_t rnd_mode)
1734c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1735c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
1736c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_log2(x.mp,v.mp,rnd_mode);
1737c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1738c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1739c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1740c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal log10(const mpreal& v, mp_rnd_t rnd_mode)
1741c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1742c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
1743c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_log10(x.mp,v.mp,rnd_mode);
1744c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1745c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1746c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1747c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal exp(const mpreal& v, mp_rnd_t rnd_mode)
1748c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1749c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
1750c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_exp(x.mp,v.mp,rnd_mode);
1751c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1752c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1753c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1754c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal exp2(const mpreal& v, mp_rnd_t rnd_mode)
1755c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1756c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
1757c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_exp2(x.mp,v.mp,rnd_mode);
1758c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1759c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1760c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1761c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal exp10(const mpreal& v, mp_rnd_t rnd_mode)
1762c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1763c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
1764c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_exp10(x.mp,v.mp,rnd_mode);
1765c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1766c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1767c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1768c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal cos(const mpreal& v, mp_rnd_t rnd_mode)
1769c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1770c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
1771c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_cos(x.mp,v.mp,rnd_mode);
1772c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1773c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1774c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1775c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal sin(const mpreal& v, mp_rnd_t rnd_mode)
1776c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1777c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
1778c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_sin(x.mp,v.mp,rnd_mode);
1779c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1780c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1781c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1782c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal tan(const mpreal& v, mp_rnd_t rnd_mode)
1783c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1784c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
1785c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_tan(x.mp,v.mp,rnd_mode);
1786c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1787c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1788c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1789c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal sec(const mpreal& v, mp_rnd_t rnd_mode)
1790c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1791c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
1792c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_sec(x.mp,v.mp,rnd_mode);
1793c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1794c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1795c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1796c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal csc(const mpreal& v, mp_rnd_t rnd_mode)
1797c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1798c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
1799c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_csc(x.mp,v.mp,rnd_mode);
1800c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1801c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1802c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1803c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal cot(const mpreal& v, mp_rnd_t rnd_mode)
1804c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1805c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
1806c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_cot(x.mp,v.mp,rnd_mode);
1807c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1808c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1809c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1810c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline int sin_cos(mpreal& s, mpreal& c, const mpreal& v, mp_rnd_t rnd_mode)
1811c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1812c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return mpfr_sin_cos(s.mp,c.mp,v.mp,rnd_mode);
1813c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1814c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1815c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal acos (const mpreal& v, mp_rnd_t rnd_mode)
1816c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1817c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
1818c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_acos(x.mp,v.mp,rnd_mode);
1819c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1820c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1821c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1822c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal asin (const mpreal& v, mp_rnd_t rnd_mode)
1823c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1824c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
1825c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_asin(x.mp,v.mp,rnd_mode);
1826c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1827c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1828c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1829c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal atan (const mpreal& v, mp_rnd_t rnd_mode)
1830c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1831c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
1832c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_atan(x.mp,v.mp,rnd_mode);
1833c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1834c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1835c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1836c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal acot (const mpreal& v, mp_rnd_t rnd_mode)
1837c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1838c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return atan(1/v, rnd_mode);
1839c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1840c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1841c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal asec (const mpreal& v, mp_rnd_t rnd_mode)
1842c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1843c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return acos(1/v, rnd_mode);
1844c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1845c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1846c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal acsc (const mpreal& v, mp_rnd_t rnd_mode)
1847c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1848c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return asin(1/v, rnd_mode);
1849c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1850c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1851c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal acoth (const mpreal& v, mp_rnd_t rnd_mode)
1852c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1853c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return atanh(1/v, rnd_mode);
1854c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1855c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1856c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal asech (const mpreal& v, mp_rnd_t rnd_mode)
1857c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1858c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return acosh(1/v, rnd_mode);
1859c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1860c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1861c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal acsch (const mpreal& v, mp_rnd_t rnd_mode)
1862c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1863c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return asinh(1/v, rnd_mode);
1864c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1865c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1866c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal atan2 (const mpreal& y, const mpreal& x, mp_rnd_t rnd_mode)
1867c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1868c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal a;
1869c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mp_prec_t yp, xp;
1870c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1871c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	yp = y.get_prec();
1872c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	xp = x.get_prec();
1873c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1874c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	a.set_prec(yp>xp?yp:xp);
1875c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1876c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_atan2(a.mp, y.mp, x.mp, rnd_mode);
1877c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1878c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return a;
1879c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1880c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1881c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal cosh (const mpreal& v, mp_rnd_t rnd_mode)
1882c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1883c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
1884c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_cosh(x.mp,v.mp,rnd_mode);
1885c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1886c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1887c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1888c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal sinh (const mpreal& v, mp_rnd_t rnd_mode)
1889c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1890c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
1891c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_sinh(x.mp,v.mp,rnd_mode);
1892c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1893c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1894c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1895c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal tanh (const mpreal& v, mp_rnd_t rnd_mode)
1896c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1897c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
1898c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_tanh(x.mp,v.mp,rnd_mode);
1899c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1900c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1901c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1902c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal sech (const mpreal& v, mp_rnd_t rnd_mode)
1903c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1904c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
1905c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_sech(x.mp,v.mp,rnd_mode);
1906c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1907c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1908c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1909c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal csch (const mpreal& v, mp_rnd_t rnd_mode)
1910c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1911c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
1912c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_csch(x.mp,v.mp,rnd_mode);
1913c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1914c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1915c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1916c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal coth (const mpreal& v, mp_rnd_t rnd_mode)
1917c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1918c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
1919c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_coth(x.mp,v.mp,rnd_mode);
1920c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1921c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1922c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1923c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal acosh  (const mpreal& v, mp_rnd_t rnd_mode)
1924c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1925c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
1926c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_acosh(x.mp,v.mp,rnd_mode);
1927c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1928c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1929c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1930c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal asinh  (const mpreal& v, mp_rnd_t rnd_mode)
1931c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1932c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
1933c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_asinh(x.mp,v.mp,rnd_mode);
1934c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1935c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1936c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1937c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal atanh  (const mpreal& v, mp_rnd_t rnd_mode)
1938c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1939c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
1940c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_atanh(x.mp,v.mp,rnd_mode);
1941c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1942c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1943c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1944c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal hypot (const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode)
1945c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1946c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal a;
1947c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mp_prec_t yp, xp;
1948c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1949c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	yp = y.get_prec();
1950c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	xp = x.get_prec();
1951c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1952c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	a.set_prec(yp>xp?yp:xp);
1953c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1954c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_hypot(a.mp, x.mp, y.mp, rnd_mode);
1955c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1956c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return a;
1957c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1958c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1959c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal remainder (const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode)
1960c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1961c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal a;
1962c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mp_prec_t yp, xp;
1963c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1964c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	yp = y.get_prec();
1965c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	xp = x.get_prec();
1966c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1967c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	a.set_prec(yp>xp?yp:xp);
1968c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1969c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_remainder(a.mp, x.mp, y.mp, rnd_mode);
1970c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1971c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return a;
1972c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1973c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1974c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal fac_ui (unsigned long int v, mp_prec_t prec, mp_rnd_t rnd_mode)
1975c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1976c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(0,prec);
1977c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_fac_ui(x.mp,v,rnd_mode);
1978c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1979c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1980c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1981c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal log1p  (const mpreal& v, mp_rnd_t rnd_mode)
1982c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1983c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
1984c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_log1p(x.mp,v.mp,rnd_mode);
1985c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1986c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1987c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1988c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal expm1  (const mpreal& v, mp_rnd_t rnd_mode)
1989c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1990c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
1991c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_expm1(x.mp,v.mp,rnd_mode);
1992c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
1993c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
1994c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1995c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal eint   (const mpreal& v, mp_rnd_t rnd_mode)
1996c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1997c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
1998c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_eint(x.mp,v.mp,rnd_mode);
1999c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
2000c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2001c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2002c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal gamma (const mpreal& x, mp_rnd_t rnd_mode)
2003c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2004c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal FunctionValue(x);
2005c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2006c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	// x < 0: gamma(-x) = -pi/(x * gamma(x) * sin(pi*x))
2007c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2008c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_gamma(FunctionValue.mp, x.mp, rnd_mode);
2009c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2010c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return FunctionValue;
2011c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2012c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2013c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal lngamma (const mpreal& v, mp_rnd_t rnd_mode)
2014c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2015c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
2016c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_lngamma(x.mp,v.mp,rnd_mode);
2017c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
2018c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2019c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2020c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal lgamma (const mpreal& v, int *signp, mp_rnd_t rnd_mode)
2021c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2022c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
2023c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	int tsignp;
2024c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2025c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	if(signp)
2026c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath		mpfr_lgamma(x.mp,signp,v.mp,rnd_mode);
2027c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	else
2028c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath		mpfr_lgamma(x.mp,&tsignp,v.mp,rnd_mode);
2029c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2030c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
2031c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2032c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2033c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal zeta (const mpreal& v, mp_rnd_t rnd_mode)
2034c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2035c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
2036c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_zeta(x.mp,v.mp,rnd_mode);
2037c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
2038c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2039c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2040c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal erf (const mpreal& v, mp_rnd_t rnd_mode)
2041c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2042c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
2043c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_erf(x.mp,v.mp,rnd_mode);
2044c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
2045c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2046c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2047c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal erfc (const mpreal& v, mp_rnd_t rnd_mode)
2048c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2049c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
2050c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_erfc(x.mp,v.mp,rnd_mode);
2051c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
2052c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2053c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2054c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal besselj0 (const mpreal& v, mp_rnd_t rnd_mode)
2055c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2056c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
2057c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_j0(x.mp,v.mp,rnd_mode);
2058c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
2059c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2060c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2061c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal besselj1 (const mpreal& v, mp_rnd_t rnd_mode)
2062c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2063c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
2064c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_j1(x.mp,v.mp,rnd_mode);
2065c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
2066c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2067c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2068c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal besseljn (long n, const mpreal& v, mp_rnd_t rnd_mode)
2069c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2070c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
2071c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_jn(x.mp,n,v.mp,rnd_mode);
2072c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
2073c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2074c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2075c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal bessely0 (const mpreal& v, mp_rnd_t rnd_mode)
2076c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2077c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
2078c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_y0(x.mp,v.mp,rnd_mode);
2079c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
2080c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2081c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2082c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal bessely1 (const mpreal& v, mp_rnd_t rnd_mode)
2083c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2084c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
2085c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_y1(x.mp,v.mp,rnd_mode);
2086c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
2087c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2088c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2089c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal besselyn (long n, const mpreal& v, mp_rnd_t rnd_mode)
2090c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2091c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
2092c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_yn(x.mp,n,v.mp,rnd_mode);
2093c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
2094c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2095c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2096c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
2097c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// MPFR 2.4.0 Specifics
2098c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0))
2099c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline int sinh_cosh(mpreal& s, mpreal& c, const mpreal& v, mp_rnd_t rnd_mode)
2101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return mpfr_sinh_cosh(s.mp,c.mp,v.mp,rnd_mode);
2103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal li2(const mpreal& v, mp_rnd_t rnd_mode)
2106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
2108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_li2(x.mp,v.mp,rnd_mode);
2109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
2110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal fmod (const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode)
2113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal a;
2115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mp_prec_t yp, xp;
2116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	yp = y.get_prec();
2118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	xp = x.get_prec();
2119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	a.set_prec(yp>xp?yp:xp);
2121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_fmod(a.mp, x.mp, y.mp, rnd_mode);
2123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return a;
2125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal rec_sqrt(const mpreal& v, mp_rnd_t rnd_mode)
2128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
2130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_rec_sqrt(x.mp,v.mp,rnd_mode);
2131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
2132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif //  MPFR 2.4.0 Specifics
2134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
2136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// MPFR 3.0.0 Specifics
2137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if (MPFR_VERSION >= MPFR_VERSION_NUM(3,0,0))
2138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal digamma(const mpreal& v, mp_rnd_t rnd_mode)
2140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
2142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_digamma(x.mp,v.mp,rnd_mode);
2143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
2144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal ai(const mpreal& v, mp_rnd_t rnd_mode)
2147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
2149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_ai(x.mp,v.mp,rnd_mode);
2150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
2151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // MPFR 3.0.0 Specifics
2154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
2156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Constants
2157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal const_log2 (mp_prec_t prec, mp_rnd_t rnd_mode)
2158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x;
2160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	x.set_prec(prec);
2161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_const_log2(x.mp,rnd_mode);
2162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
2163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal const_pi (mp_prec_t prec, mp_rnd_t rnd_mode)
2166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x;
2168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	x.set_prec(prec);
2169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_const_pi(x.mp,rnd_mode);
2170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
2171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal const_euler (mp_prec_t prec, mp_rnd_t rnd_mode)
2174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x;
2176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	x.set_prec(prec);
2177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_const_euler(x.mp,rnd_mode);
2178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
2179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal const_catalan (mp_prec_t prec, mp_rnd_t rnd_mode)
2182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x;
2184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	x.set_prec(prec);
2185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_const_catalan(x.mp,rnd_mode);
2186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
2187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal const_infinity (int sign, mp_prec_t prec, mp_rnd_t rnd_mode)
2190c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x;
2192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	x.set_prec(prec,rnd_mode);
2193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_set_inf(x.mp, sign);
2194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
2195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2197c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
2198c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Integer Related Functions
2199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal rint(const mpreal& v, mp_rnd_t rnd_mode)
2200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
2202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_rint(x.mp,v.mp,rnd_mode);
2203c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
2204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2205c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2206c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal ceil(const mpreal& v)
2207c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2208c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
2209c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_ceil(x.mp,v.mp);
2210c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
2211c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2212c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2213c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2214c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal floor(const mpreal& v)
2215c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2216c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
2217c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_floor(x.mp,v.mp);
2218c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
2219c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2220c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2221c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal round(const mpreal& v)
2222c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2223c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
2224c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_round(x.mp,v.mp);
2225c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
2226c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2227c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2228c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal trunc(const mpreal& v)
2229c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2230c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
2231c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_trunc(x.mp,v.mp);
2232c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
2233c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2234c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2235c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal rint_ceil (const mpreal& v, mp_rnd_t rnd_mode)
2236c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2237c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
2238c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_rint_ceil(x.mp,v.mp,rnd_mode);
2239c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
2240c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2241c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2242c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal rint_floor(const mpreal& v, mp_rnd_t rnd_mode)
2243c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2244c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
2245c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_rint_floor(x.mp,v.mp,rnd_mode);
2246c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
2247c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2248c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2249c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal rint_round(const mpreal& v, mp_rnd_t rnd_mode)
2250c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2251c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
2252c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_rint_round(x.mp,v.mp,rnd_mode);
2253c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
2254c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2255c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2256c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal rint_trunc(const mpreal& v, mp_rnd_t rnd_mode)
2257c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2258c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
2259c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_rint_trunc(x.mp,v.mp,rnd_mode);
2260c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
2261c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2262c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2263c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal frac (const mpreal& v, mp_rnd_t rnd_mode)
2264c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2265c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(v);
2266c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_frac(x.mp,v.mp,rnd_mode);
2267c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
2268c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2269c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2270c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
2271c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Miscellaneous Functions
2272c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline void swap(mpreal& a, mpreal& b)
2273c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2274c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_swap(a.mp,b.mp);
2275c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2276c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2277c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal (max)(const mpreal& x, const mpreal& y)
2278c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2279c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return (x>y?x:y);
2280c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2281c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2282c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal (min)(const mpreal& x, const mpreal& y)
2283c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2284c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return (x<y?x:y);
2285c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2286c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2287c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal fmax(const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode)
2288c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2289c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal a;
2290c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_max(a.mp,x.mp,y.mp,rnd_mode);
2291c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return a;
2292c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2293c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2294c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal fmin(const mpreal& x, const mpreal& y,  mp_rnd_t rnd_mode)
2295c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2296c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal a;
2297c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_min(a.mp,x.mp,y.mp,rnd_mode);
2298c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return a;
2299c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2300c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2301c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal nexttoward (const mpreal& x, const mpreal& y)
2302c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2303c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal a(x);
2304c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_nexttoward(a.mp,y.mp);
2305c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return a;
2306c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2307c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2308c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal nextabove  (const mpreal& x)
2309c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2310c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal a(x);
2311c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_nextabove(a.mp);
2312c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return a;
2313c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2314c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2315c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal nextbelow  (const mpreal& x)
2316c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2317c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal a(x);
2318c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_nextbelow(a.mp);
2319c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return a;
2320c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2321c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2322c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal urandomb (gmp_randstate_t& state)
2323c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2324c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x;
2325c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_urandomb(x.mp,state);
2326c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
2327c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2328c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2329c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if (MPFR_VERSION >= MPFR_VERSION_NUM(3,0,0))
2330c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// use gmp_randinit_default() to init state, gmp_randclear() to clear
2331c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal urandom (gmp_randstate_t& state, mp_rnd_t rnd_mode)
2332c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2333c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x;
2334c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_urandom(x.mp,state,rnd_mode);
2335c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
2336c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2337c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
2338c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2339c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if (MPFR_VERSION <= MPFR_VERSION_NUM(2,4,2))
2340c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal random2 (mp_size_t size, mp_exp_t exp)
2341c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2342c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x;
2343c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_random2(x.mp,size,exp);
2344c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
2345c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2346c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
2347c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2348c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Uniformly distributed random number generation
2349c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// a = random(seed); <- initialization & first random number generation
2350c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// a = random();     <- next random numbers generation
2351c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// seed != 0
2352c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal random(unsigned int seed)
2353c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2354c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2355c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if (MPFR_VERSION >= MPFR_VERSION_NUM(3,0,0))
2356c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	static gmp_randstate_t state;
2357c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	static bool isFirstTime = true;
2358c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2359c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	if(isFirstTime)
2360c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	{
2361c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath		gmp_randinit_default(state);
2362c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath		gmp_randseed_ui(state,0);
2363c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath		isFirstTime = false;
2364c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	}
2365c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2366c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	if(seed != 0)	gmp_randseed_ui(state,seed);
2367c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2368c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return mpfr::urandom(state);
2369c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#else
2370c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	if(seed != 0)	std::srand(seed);
2371c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return mpfr::mpreal(std::rand()/(double)RAND_MAX);
2372c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
2373c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2374c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2375c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2376c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//////////////////////////////////////////////////////////////////////////
2377c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Set/Get global properties
2378c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline void mpreal::set_default_prec(mp_prec_t prec)
2379c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2380c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	default_prec = prec;
2381c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_set_default_prec(prec);
2382c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2383c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2384c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mp_prec_t mpreal::get_default_prec()
2385c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2386c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return (mpfr_get_default_prec)();
2387c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2388c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2389c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline void mpreal::set_default_base(int base)
2390c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2391c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	default_base = base;
2392c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2393c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2394c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline int mpreal::get_default_base()
2395c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2396c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return default_base;
2397c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2398c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2399c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline void mpreal::set_default_rnd(mp_rnd_t rnd_mode)
2400c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2401c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	default_rnd =  rnd_mode;
2402c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_set_default_rounding_mode(rnd_mode);
2403c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2404c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2405c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline mp_rnd_t mpreal::get_default_rnd()
2406c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2407c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return static_cast<mp_rnd_t>((mpfr_get_default_rounding_mode)());
2408c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2409c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2410c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline void mpreal::set_double_bits(int dbits)
2411c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2412c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	double_bits = dbits;
2413c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2414c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2415c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline int mpreal::get_double_bits()
2416c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2417c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return double_bits;
2418c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2419c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2420c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline bool mpreal::fits_in_bits(double x, int n)
2421c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2422c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	int i;
2423c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	double t;
2424c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return IsInf(x) || (std::modf ( std::ldexp ( std::frexp ( x, &i ), n ), &t ) == 0.0);
2425c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2426c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2427c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const mpreal& a, const mpreal& b, mp_rnd_t rnd_mode)
2428c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2429c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(a);
2430c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_pow(x.mp,x.mp,b.mp,rnd_mode);
2431c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
2432c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2433c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2434c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const mpreal& a, const mpz_t b, mp_rnd_t rnd_mode)
2435c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2436c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(a);
2437c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_pow_z(x.mp,x.mp,b,rnd_mode);
2438c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
2439c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2440c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2441c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const mpreal& a, const unsigned long int b, mp_rnd_t rnd_mode)
2442c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2443c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(a);
2444c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_pow_ui(x.mp,x.mp,b,rnd_mode);
2445c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
2446c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2447c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2448c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const mpreal& a, const unsigned int b, mp_rnd_t rnd_mode)
2449c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2450c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return pow(a,static_cast<unsigned long int>(b),rnd_mode);
2451c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2452c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2453c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const mpreal& a, const long int b, mp_rnd_t rnd_mode)
2454c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2455c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(a);
2456c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_pow_si(x.mp,x.mp,b,rnd_mode);
2457c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
2458c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2459c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2460c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const mpreal& a, const int b, mp_rnd_t rnd_mode)
2461c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2462c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return pow(a,static_cast<long int>(b),rnd_mode);
2463c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2464c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2465c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const mpreal& a, const long double b, mp_rnd_t rnd_mode)
2466c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2467c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return pow(a,mpreal(b),rnd_mode);
2468c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2469c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2470c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const mpreal& a, const double b, mp_rnd_t rnd_mode)
2471c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2472c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return pow(a,mpreal(b),rnd_mode);
2473c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2474c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2475c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const unsigned long int a, const mpreal& b, mp_rnd_t rnd_mode)
2476c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2477c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(a);
2478c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_ui_pow(x.mp,a,b.mp,rnd_mode);
2479c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
2480c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2481c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2482c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const unsigned int a, const mpreal& b, mp_rnd_t rnd_mode)
2483c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2484c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return pow(static_cast<unsigned long int>(a),b,rnd_mode);
2485c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2486c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2487c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const long int a, const mpreal& b, mp_rnd_t rnd_mode)
2488c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2489c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	if (a>=0) 	return pow(static_cast<unsigned long int>(a),b,rnd_mode);
2490c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	else		return pow(mpreal(a),b,rnd_mode);
2491c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2492c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2493c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const int a, const mpreal& b, mp_rnd_t rnd_mode)
2494c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2495c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	if (a>=0) 	return pow(static_cast<unsigned long int>(a),b,rnd_mode);
2496c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	else		return pow(mpreal(a),b,rnd_mode);
2497c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2498c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2499c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const long double a, const mpreal& b, mp_rnd_t rnd_mode)
2500c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2501c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return pow(mpreal(a),b,rnd_mode);
2502c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2503c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2504c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const double a, const mpreal& b, mp_rnd_t rnd_mode)
2505c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2506c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return pow(mpreal(a),b,rnd_mode);
2507c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2508c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2509c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// pow unsigned long int
2510c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const unsigned long int a, const unsigned long int b, mp_rnd_t rnd_mode)
2511c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2512c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpreal x(a);
2513c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	mpfr_ui_pow_ui(x.mp,a,b,rnd_mode);
2514c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return x;
2515c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2516c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2517c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const unsigned long int a, const unsigned int b, mp_rnd_t rnd_mode)
2518c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2519c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return pow(a,static_cast<unsigned long int>(b),rnd_mode); //mpfr_ui_pow_ui
2520c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2521c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2522c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const unsigned long int a, const long int b, mp_rnd_t rnd_mode)
2523c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2524c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	if(b>0)	return pow(a,static_cast<unsigned long int>(b),rnd_mode); //mpfr_ui_pow_ui
2525c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	else	return pow(a,mpreal(b),rnd_mode); //mpfr_ui_pow
2526c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2527c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2528c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const unsigned long int a, const int b, mp_rnd_t rnd_mode)
2529c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2530c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	if(b>0)	return pow(a,static_cast<unsigned long int>(b),rnd_mode); //mpfr_ui_pow_ui
2531c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	else	return pow(a,mpreal(b),rnd_mode); //mpfr_ui_pow
2532c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2533c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2534c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const unsigned long int a, const long double b, mp_rnd_t rnd_mode)
2535c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2536c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return pow(a,mpreal(b),rnd_mode); //mpfr_ui_pow
2537c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2538c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2539c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const unsigned long int a, const double b, mp_rnd_t rnd_mode)
2540c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2541c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return pow(a,mpreal(b),rnd_mode); //mpfr_ui_pow
2542c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2543c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2544c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// pow unsigned int
2545c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const unsigned int a, const unsigned long int b, mp_rnd_t rnd_mode)
2546c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2547c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return pow(static_cast<unsigned long int>(a),b,rnd_mode); //mpfr_ui_pow_ui
2548c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2549c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2550c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const unsigned int a, const unsigned int b, mp_rnd_t rnd_mode)
2551c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2552c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return pow(static_cast<unsigned long int>(a),static_cast<unsigned long int>(b),rnd_mode); //mpfr_ui_pow_ui
2553c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2554c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2555c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const unsigned int a, const long int b, mp_rnd_t rnd_mode)
2556c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2557c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	if(b>0)	return pow(static_cast<unsigned long int>(a),static_cast<unsigned long int>(b),rnd_mode); //mpfr_ui_pow_ui
2558c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	else	return pow(static_cast<unsigned long int>(a),mpreal(b),rnd_mode); //mpfr_ui_pow
2559c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2560c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2561c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const unsigned int a, const int b, mp_rnd_t rnd_mode)
2562c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2563c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	if(b>0)	return pow(static_cast<unsigned long int>(a),static_cast<unsigned long int>(b),rnd_mode); //mpfr_ui_pow_ui
2564c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	else	return pow(static_cast<unsigned long int>(a),mpreal(b),rnd_mode); //mpfr_ui_pow
2565c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2566c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2567c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const unsigned int a, const long double b, mp_rnd_t rnd_mode)
2568c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2569c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return pow(static_cast<unsigned long int>(a),mpreal(b),rnd_mode); //mpfr_ui_pow
2570c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2571c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2572c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const unsigned int a, const double b, mp_rnd_t rnd_mode)
2573c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2574c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return pow(static_cast<unsigned long int>(a),mpreal(b),rnd_mode); //mpfr_ui_pow
2575c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2576c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2577c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// pow long int
2578c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const long int a, const unsigned long int b, mp_rnd_t rnd_mode)
2579c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2580c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	if (a>0) return pow(static_cast<unsigned long int>(a),b,rnd_mode); //mpfr_ui_pow_ui
2581c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	else	 return pow(mpreal(a),b,rnd_mode); //mpfr_pow_ui
2582c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2583c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2584c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const long int a, const unsigned int b, mp_rnd_t rnd_mode)
2585c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2586c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	if (a>0) return pow(static_cast<unsigned long int>(a),static_cast<unsigned long int>(b),rnd_mode);  //mpfr_ui_pow_ui
2587c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	else	 return pow(mpreal(a),static_cast<unsigned long int>(b),rnd_mode); //mpfr_pow_ui
2588c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2589c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2590c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const long int a, const long int b, mp_rnd_t rnd_mode)
2591c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2592c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	if (a>0)
2593c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	{
2594c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath		if(b>0) return pow(static_cast<unsigned long int>(a),static_cast<unsigned long int>(b),rnd_mode); //mpfr_ui_pow_ui
2595c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath		else	return pow(static_cast<unsigned long int>(a),mpreal(b),rnd_mode); //mpfr_ui_pow
2596c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	}else{
2597c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath		return pow(mpreal(a),b,rnd_mode); // mpfr_pow_si
2598c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	}
2599c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2600c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2601c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const long int a, const int b, mp_rnd_t rnd_mode)
2602c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2603c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	if (a>0)
2604c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	{
2605c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath		if(b>0) return pow(static_cast<unsigned long int>(a),static_cast<unsigned long int>(b),rnd_mode); //mpfr_ui_pow_ui
2606c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath		else	return pow(static_cast<unsigned long int>(a),mpreal(b),rnd_mode); //mpfr_ui_pow
2607c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	}else{
2608c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath		return pow(mpreal(a),static_cast<long int>(b),rnd_mode); // mpfr_pow_si
2609c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	}
2610c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2611c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2612c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const long int a, const long double b, mp_rnd_t rnd_mode)
2613c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2614c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	if (a>=0) 	return pow(static_cast<unsigned long int>(a),mpreal(b),rnd_mode); //mpfr_ui_pow
2615c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	else		return pow(mpreal(a),mpreal(b),rnd_mode); //mpfr_pow
2616c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2617c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2618c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const long int a, const double b, mp_rnd_t rnd_mode)
2619c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2620c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	if (a>=0) 	return pow(static_cast<unsigned long int>(a),mpreal(b),rnd_mode); //mpfr_ui_pow
2621c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	else		return pow(mpreal(a),mpreal(b),rnd_mode); //mpfr_pow
2622c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2623c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2624c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// pow int
2625c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const int a, const unsigned long int b, mp_rnd_t rnd_mode)
2626c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2627c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	if (a>0) return pow(static_cast<unsigned long int>(a),b,rnd_mode); //mpfr_ui_pow_ui
2628c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	else	 return pow(mpreal(a),b,rnd_mode); //mpfr_pow_ui
2629c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2630c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2631c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const int a, const unsigned int b, mp_rnd_t rnd_mode)
2632c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2633c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	if (a>0) return pow(static_cast<unsigned long int>(a),static_cast<unsigned long int>(b),rnd_mode);  //mpfr_ui_pow_ui
2634c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	else	 return pow(mpreal(a),static_cast<unsigned long int>(b),rnd_mode); //mpfr_pow_ui
2635c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2636c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2637c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const int a, const long int b, mp_rnd_t rnd_mode)
2638c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2639c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	if (a>0)
2640c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	{
2641c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath		if(b>0) return pow(static_cast<unsigned long int>(a),static_cast<unsigned long int>(b),rnd_mode); //mpfr_ui_pow_ui
2642c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath		else	return pow(static_cast<unsigned long int>(a),mpreal(b),rnd_mode); //mpfr_ui_pow
2643c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	}else{
2644c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath		return pow(mpreal(a),b,rnd_mode); // mpfr_pow_si
2645c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	}
2646c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2647c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2648c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const int a, const int b, mp_rnd_t rnd_mode)
2649c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2650c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	if (a>0)
2651c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	{
2652c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath		if(b>0) return pow(static_cast<unsigned long int>(a),static_cast<unsigned long int>(b),rnd_mode); //mpfr_ui_pow_ui
2653c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath		else	return pow(static_cast<unsigned long int>(a),mpreal(b),rnd_mode); //mpfr_ui_pow
2654c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	}else{
2655c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath		return pow(mpreal(a),static_cast<long int>(b),rnd_mode); // mpfr_pow_si
2656c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	}
2657c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2658c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2659c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const int a, const long double b, mp_rnd_t rnd_mode)
2660c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2661c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	if (a>=0) 	return pow(static_cast<unsigned long int>(a),mpreal(b),rnd_mode); //mpfr_ui_pow
2662c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	else		return pow(mpreal(a),mpreal(b),rnd_mode); //mpfr_pow
2663c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2664c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2665c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const int a, const double b, mp_rnd_t rnd_mode)
2666c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2667c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	if (a>=0) 	return pow(static_cast<unsigned long int>(a),mpreal(b),rnd_mode); //mpfr_ui_pow
2668c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	else		return pow(mpreal(a),mpreal(b),rnd_mode); //mpfr_pow
2669c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2670c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2671c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// pow long double
2672c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const long double a, const long double b, mp_rnd_t rnd_mode)
2673c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2674c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return pow(mpreal(a),mpreal(b),rnd_mode);
2675c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2676c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2677c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const long double a, const unsigned long int b, mp_rnd_t rnd_mode)
2678c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2679c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return pow(mpreal(a),b,rnd_mode); //mpfr_pow_ui
2680c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2681c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2682c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const long double a, const unsigned int b, mp_rnd_t rnd_mode)
2683c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2684c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return pow(mpreal(a),static_cast<unsigned long int>(b),rnd_mode); //mpfr_pow_ui
2685c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2686c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2687c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const long double a, const long int b, mp_rnd_t rnd_mode)
2688c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2689c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return pow(mpreal(a),b,rnd_mode); // mpfr_pow_si
2690c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2691c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2692c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const long double a, const int b, mp_rnd_t rnd_mode)
2693c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2694c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return pow(mpreal(a),static_cast<long int>(b),rnd_mode); // mpfr_pow_si
2695c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2696c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2697c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const double a, const double b, mp_rnd_t rnd_mode)
2698c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2699c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return pow(mpreal(a),mpreal(b),rnd_mode);
2700c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2701c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2702c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const double a, const unsigned long int b, mp_rnd_t rnd_mode)
2703c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2704c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return pow(mpreal(a),b,rnd_mode); // mpfr_pow_ui
2705c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2706c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2707c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const double a, const unsigned int b, mp_rnd_t rnd_mode)
2708c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2709c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return pow(mpreal(a),static_cast<unsigned long int>(b),rnd_mode); // mpfr_pow_ui
2710c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2711c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2712c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const double a, const long int b, mp_rnd_t rnd_mode)
2713c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2714c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return pow(mpreal(a),b,rnd_mode); // mpfr_pow_si
2715c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2716c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2717c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const mpreal pow(const double a, const int b, mp_rnd_t rnd_mode)
2718c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2719c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	return pow(mpreal(a),static_cast<long int>(b),rnd_mode); // mpfr_pow_si
2720c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2721c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // End of mpfr namespace
2722c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2723c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Explicit specialization of std::swap for mpreal numbers
2724c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Thus standard algorithms will use efficient version of swap (due to Koenig lookup)
2725c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Non-throwing swap C++ idiom: http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Non-throwing_swap
2726c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace std
2727c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2728c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	template <>
2729c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	inline void swap(mpfr::mpreal& x, mpfr::mpreal& y)
2730c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	{
2731c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath		return mpfr::swap(x, y);
2732c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	}
2733c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
2734c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2735c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif /* __MPREAL_H__ */
2736