2011-08-19 21:03:45 +08:00
/*
2012-06-21 15:56:54 +08:00
Multi - precision real number class . C + + interface for MPFR library .
2011-08-19 21:03:45 +08:00
Project homepage : http : //www.holoborodko.com/pavel/
Contact e - mail : pavel @ holoborodko . com
2012-06-21 15:56:54 +08:00
Copyright ( c ) 2008 - 2012 Pavel Holoborodko
2011-08-19 21:03:45 +08:00
Core Developers :
Pavel Holoborodko , Dmitriy Gubanov , Konstantin Holoborodko .
Contributors :
Brian Gladman , Helmut Jarausch , Fokko Beekhof , Ulrich Mutze ,
2012-06-21 15:56:54 +08:00
Heinz van Saanen , Pere Constans , Peter van Hoof , Gael Guennebaud ,
Tsai Chia Cheng , Alexei Zubanov .
2011-08-19 21:03:45 +08:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
This library is free software ; you can redistribute it and / or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation ; either
version 2.1 of the License , or ( at your option ) any later version .
This library is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
Lesser General Public License for more details .
You should have received a copy of the GNU Lesser General Public
License along with this library ; if not , write to the Free Software
Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Redistribution and use in source and binary forms , with or without
modification , are permitted provided that the following conditions
are met :
1. Redistributions of source code must retain the above copyright
notice , this list of conditions and the following disclaimer .
2. Redistributions in binary form must reproduce the above copyright
notice , this list of conditions and the following disclaimer in the
documentation and / or other materials provided with the distribution .
2012-06-21 15:56:54 +08:00
3. The name of the author may be used to endorse or promote products
derived from this software without specific prior written permission .
2011-08-19 21:03:45 +08:00
THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ` ` AS IS ' ' AND
ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED . IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT , INDIRECT , INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL
DAMAGES ( INCLUDING , BUT NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES ; LOSS OF USE , DATA , OR PROFITS ; OR BUSINESS INTERRUPTION )
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT
LIABILITY , OR TORT ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY
OUT OF THE USE OF THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE .
*/
2012-06-21 15:56:54 +08:00
# ifndef __MPREAL_H__
# define __MPREAL_H__
2011-08-19 21:03:45 +08:00
# include <string>
# include <iostream>
# include <sstream>
# include <stdexcept>
# include <cfloat>
# include <cmath>
2012-06-21 15:56:54 +08:00
// Options
# define MPREAL_HAVE_INT64_SUPPORT // int64_t support: available only for MSVC 2010 & GCC
# define MPREAL_HAVE_MSVC_DEBUGVIEW // Enable Debugger Visualizer (valid only for MSVC in "Debug" builds)
2011-08-19 21:03:45 +08:00
// Detect compiler using signatures from http://predef.sourceforge.net/
# if defined(__GNUC__) && defined(__INTEL_COMPILER)
# define IsInf(x) isinf(x) // Intel ICC compiler on Linux
2012-06-21 15:56:54 +08:00
# elif defined(_MSC_VER) // Microsoft Visual C++
# define IsInf(x) (!_finite(x))
2011-08-19 21:03:45 +08:00
# elif defined(__GNUC__)
# define IsInf(x) std::isinf(x) // GNU C/C++
# else
# define IsInf(x) std::isinf(x) // Unknown compiler, just hope for C99 conformance
# endif
2012-06-21 15:56:54 +08:00
# if defined(MPREAL_HAVE_INT64_SUPPORT)
# define MPFR_USE_INTMAX_T // should be defined before mpfr.h
# if defined(_MSC_VER) // <stdint.h> is available only in msvc2010!
# if (_MSC_VER >= 1600)
# include <stdint.h>
# else // MPFR relies on intmax_t which is available only in msvc2010
# undef MPREAL_HAVE_INT64_SUPPORT // Besides, MPFR - MPIR have to be compiled with msvc2010
# undef MPFR_USE_INTMAX_T // Since we cannot detect this, disable x64 by default
// Someone should change this manually if needed.
# endif
# endif
# if defined (__MINGW32__) || defined(__MINGW64__)
# include <stdint.h> // equivalent to msvc2010
# elif defined (__GNUC__)
# if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64)
# undef MPREAL_HAVE_INT64_SUPPORT // remove all shaman dances for x64 builds since
# undef MPFR_USE_INTMAX_T // GCC already support x64 as of "long int" is 64-bit integer, nothing left to do
# else
# include <stdint.h> // use int64_t, uint64_t otherwise.
# endif
# endif
# endif
# if defined(MPREAL_HAVE_MSVC_DEBUGVIEW) && defined(_MSC_VER) && defined(_DEBUG)
# define MPREAL_MSVC_DEBUGVIEW_CODE DebugView = toString()
# define MPREAL_MSVC_DEBUGVIEW_DATA std::string DebugView
# else
# define MPREAL_MSVC_DEBUGVIEW_CODE
# define MPREAL_MSVC_DEBUGVIEW_DATA
# endif
# include <mpfr.h>
# if (MPFR_VERSION < MPFR_VERSION_NUM(3,0,0))
# include <cstdlib> // needed for random()
# endif
2011-08-19 21:03:45 +08:00
namespace mpfr {
class mpreal {
private :
mpfr_t mp ;
public :
2012-06-21 15:56:54 +08:00
static mp_rnd_t default_rnd ;
static mp_prec_t default_prec ;
static int default_base ;
static int double_bits ;
2011-08-19 21:03:45 +08:00
public :
// Constructors && type conversion
mpreal ( ) ;
mpreal ( const mpreal & u ) ;
mpreal ( const mpfr_t u ) ;
mpreal ( const mpf_t u ) ;
mpreal ( const mpz_t u , mp_prec_t prec = default_prec , mp_rnd_t mode = default_rnd ) ;
mpreal ( const mpq_t u , mp_prec_t prec = default_prec , mp_rnd_t mode = default_rnd ) ;
mpreal ( const double u , mp_prec_t prec = default_prec , mp_rnd_t mode = default_rnd ) ;
mpreal ( const long double u , mp_prec_t prec = default_prec , mp_rnd_t mode = default_rnd ) ;
mpreal ( const unsigned long int u , mp_prec_t prec = default_prec , mp_rnd_t mode = default_rnd ) ;
mpreal ( const unsigned int u , mp_prec_t prec = default_prec , mp_rnd_t mode = default_rnd ) ;
mpreal ( const long int u , mp_prec_t prec = default_prec , mp_rnd_t mode = default_rnd ) ;
mpreal ( const int u , mp_prec_t prec = default_prec , mp_rnd_t mode = default_rnd ) ;
2012-06-21 15:56:54 +08:00
# if defined (MPREAL_HAVE_INT64_SUPPORT)
mpreal ( const uint64_t u , mp_prec_t prec = default_prec , mp_rnd_t mode = default_rnd ) ;
mpreal ( const int64_t u , mp_prec_t prec = default_prec , mp_rnd_t mode = default_rnd ) ;
# endif
2011-08-19 21:03:45 +08:00
mpreal ( const char * s , mp_prec_t prec = default_prec , int base = default_base , mp_rnd_t mode = default_rnd ) ;
mpreal ( const std : : string & s , mp_prec_t prec = default_prec , int base = default_base , mp_rnd_t mode = default_rnd ) ;
~ mpreal ( ) ;
// Operations
// =
// +, -, *, /, ++, --, <<, >>
// *=, +=, -=, /=,
// <, >, ==, <=, >=
// =
mpreal & operator = ( const mpreal & v ) ;
mpreal & operator = ( const mpf_t v ) ;
mpreal & operator = ( const mpz_t v ) ;
mpreal & operator = ( const mpq_t v ) ;
mpreal & operator = ( const long double v ) ;
mpreal & operator = ( const double v ) ;
mpreal & operator = ( const unsigned long int v ) ;
mpreal & operator = ( const unsigned int v ) ;
mpreal & operator = ( const long int v ) ;
mpreal & operator = ( const int v ) ;
mpreal & operator = ( const char * s ) ;
// +
mpreal & operator + = ( const mpreal & v ) ;
mpreal & operator + = ( const mpf_t v ) ;
mpreal & operator + = ( const mpz_t v ) ;
mpreal & operator + = ( const mpq_t v ) ;
mpreal & operator + = ( const long double u ) ;
mpreal & operator + = ( const double u ) ;
mpreal & operator + = ( const unsigned long int u ) ;
mpreal & operator + = ( const unsigned int u ) ;
mpreal & operator + = ( const long int u ) ;
mpreal & operator + = ( const int u ) ;
2012-06-21 15:56:54 +08:00
# if defined (MPREAL_HAVE_INT64_SUPPORT)
mpreal & operator + = ( const int64_t u ) ;
mpreal & operator + = ( const uint64_t u ) ;
mpreal & operator - = ( const int64_t u ) ;
mpreal & operator - = ( const uint64_t u ) ;
mpreal & operator * = ( const int64_t u ) ;
mpreal & operator * = ( const uint64_t u ) ;
mpreal & operator / = ( const int64_t u ) ;
mpreal & operator / = ( const uint64_t u ) ;
# endif
2011-08-19 21:03:45 +08:00
const mpreal operator + ( ) const ;
mpreal & operator + + ( ) ;
const mpreal operator + + ( int ) ;
// -
mpreal & operator - = ( const mpreal & v ) ;
mpreal & operator - = ( const mpz_t v ) ;
mpreal & operator - = ( const mpq_t v ) ;
mpreal & operator - = ( const long double u ) ;
mpreal & operator - = ( const double u ) ;
mpreal & operator - = ( const unsigned long int u ) ;
mpreal & operator - = ( const unsigned int u ) ;
mpreal & operator - = ( const long int u ) ;
mpreal & operator - = ( const int u ) ;
const mpreal operator - ( ) const ;
friend const mpreal operator - ( const unsigned long int b , const mpreal & a ) ;
friend const mpreal operator - ( const unsigned int b , const mpreal & a ) ;
friend const mpreal operator - ( const long int b , const mpreal & a ) ;
friend const mpreal operator - ( const int b , const mpreal & a ) ;
friend const mpreal operator - ( const double b , const mpreal & a ) ;
mpreal & operator - - ( ) ;
const mpreal operator - - ( int ) ;
// *
mpreal & operator * = ( const mpreal & v ) ;
mpreal & operator * = ( const mpz_t v ) ;
mpreal & operator * = ( const mpq_t v ) ;
mpreal & operator * = ( const long double v ) ;
mpreal & operator * = ( const double v ) ;
mpreal & operator * = ( const unsigned long int v ) ;
mpreal & operator * = ( const unsigned int v ) ;
mpreal & operator * = ( const long int v ) ;
mpreal & operator * = ( const int v ) ;
// /
mpreal & operator / = ( const mpreal & v ) ;
mpreal & operator / = ( const mpz_t v ) ;
mpreal & operator / = ( const mpq_t v ) ;
mpreal & operator / = ( const long double v ) ;
mpreal & operator / = ( const double v ) ;
mpreal & operator / = ( const unsigned long int v ) ;
mpreal & operator / = ( const unsigned int v ) ;
mpreal & operator / = ( const long int v ) ;
mpreal & operator / = ( const int v ) ;
friend const mpreal operator / ( const unsigned long int b , const mpreal & a ) ;
friend const mpreal operator / ( const unsigned int b , const mpreal & a ) ;
friend const mpreal operator / ( const long int b , const mpreal & a ) ;
friend const mpreal operator / ( const int b , const mpreal & a ) ;
friend const mpreal operator / ( const double b , const mpreal & a ) ;
//<<= Fast Multiplication by 2^u
mpreal & operator < < = ( const unsigned long int u ) ;
mpreal & operator < < = ( const unsigned int u ) ;
mpreal & operator < < = ( const long int u ) ;
mpreal & operator < < = ( const int u ) ;
//>>= Fast Division by 2^u
mpreal & operator > > = ( const unsigned long int u ) ;
mpreal & operator > > = ( const unsigned int u ) ;
mpreal & operator > > = ( const long int u ) ;
mpreal & operator > > = ( const int u ) ;
// Boolean Operators
friend bool operator > ( const mpreal & a , const mpreal & b ) ;
friend bool operator > = ( const mpreal & a , const mpreal & b ) ;
friend bool operator < ( const mpreal & a , const mpreal & b ) ;
friend bool operator < = ( const mpreal & a , const mpreal & b ) ;
friend bool operator = = ( const mpreal & a , const mpreal & b ) ;
friend bool operator ! = ( const mpreal & a , const mpreal & b ) ;
2012-06-21 15:56:54 +08:00
// Optimized specializations for boolean operators
friend bool operator = = ( const mpreal & a , const unsigned long int b ) ;
friend bool operator = = ( const mpreal & a , const unsigned int b ) ;
friend bool operator = = ( const mpreal & a , const long int b ) ;
friend bool operator = = ( const mpreal & a , const int b ) ;
friend bool operator = = ( const mpreal & a , const long double b ) ;
friend bool operator = = ( const mpreal & a , const double b ) ;
2011-08-19 21:03:45 +08:00
// Type Conversion operators
2012-06-21 15:56:54 +08:00
long toLong ( ) const ;
unsigned long toULong ( ) const ;
double toDouble ( ) const ;
long double toLDouble ( ) const ;
# if defined (MPREAL_HAVE_INT64_SUPPORT)
int64_t toInt64 ( ) const ;
uint64_t toUInt64 ( ) const ;
# endif
// Get raw pointers
: : mpfr_ptr mpfr_ptr ( ) ;
: : mpfr_srcptr mpfr_srcptr ( ) const ;
// Convert mpreal to string with n significant digits in base b
// n = 0 -> convert with the maximum available digits
std : : string toString ( int n = 0 , int b = default_base , mp_rnd_t mode = default_rnd ) const ;
# if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0))
std : : string toString ( const std : : string & format ) const ;
# endif
2011-08-19 21:03:45 +08:00
// Math Functions
2012-06-21 15:56:54 +08:00
friend const mpreal sqr ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
2011-08-19 21:03:45 +08:00
friend const mpreal sqrt ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal sqrt ( const unsigned long int v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal cbrt ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal root ( const mpreal & v , unsigned long int k , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
2012-06-21 15:56:54 +08:00
friend const mpreal pow ( const mpreal & a , const mpreal & b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal pow ( const mpreal & a , const mpz_t b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal pow ( const mpreal & a , const unsigned long int b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal pow ( const mpreal & a , const long int b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal pow ( const unsigned long int a , const mpreal & b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal pow ( const unsigned long int a , const unsigned long int b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
2011-08-19 21:03:45 +08:00
friend const mpreal fabs ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal abs ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal dim ( const mpreal & a , const mpreal & b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend inline const mpreal mul_2ui ( const mpreal & v , unsigned long int k , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend inline const mpreal mul_2si ( const mpreal & v , long int k , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend inline const mpreal div_2ui ( const mpreal & v , unsigned long int k , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend inline const mpreal div_2si ( const mpreal & v , long int k , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend int cmpabs ( const mpreal & a , const mpreal & b ) ;
friend const mpreal log ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal log2 ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal log10 ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal exp ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal exp2 ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal exp10 ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
2012-06-21 15:56:54 +08:00
friend const mpreal log1p ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal expm1 ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
2011-08-19 21:03:45 +08:00
friend const mpreal cos ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal sin ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal tan ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal sec ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal csc ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal cot ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend int sin_cos ( mpreal & s , mpreal & c , const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal acos ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal asin ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal atan ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal atan2 ( const mpreal & y , const mpreal & x , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
2012-06-21 15:56:54 +08:00
friend const mpreal acot ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal asec ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal acsc ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
2011-08-19 21:03:45 +08:00
friend const mpreal cosh ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal sinh ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal tanh ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal sech ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal csch ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal coth ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
2012-06-21 15:56:54 +08:00
friend const mpreal acosh ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal asinh ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal atanh ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal acoth ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal asech ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal acsch ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
2011-08-19 21:03:45 +08:00
friend const mpreal hypot ( const mpreal & x , const mpreal & y , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal fac_ui ( unsigned long int v , mp_prec_t prec = mpreal : : default_prec , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal eint ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal gamma ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal lngamma ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal lgamma ( const mpreal & v , int * signp = 0 , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal zeta ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal erf ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal erfc ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
2012-06-21 15:56:54 +08:00
friend const mpreal besselj0 ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal besselj1 ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal besseljn ( long n , const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal bessely0 ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal bessely1 ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal besselyn ( long n , const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
2011-08-19 21:03:45 +08:00
friend const mpreal fma ( const mpreal & v1 , const mpreal & v2 , const mpreal & v3 , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal fms ( const mpreal & v1 , const mpreal & v2 , const mpreal & v3 , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal agm ( const mpreal & v1 , const mpreal & v2 , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal sum ( const mpreal tab [ ] , unsigned long int n , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend int sgn ( const mpreal & v ) ; // -1 or +1
// MPFR 2.4.0 Specifics
# if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0))
friend int sinh_cosh ( mpreal & s , mpreal & c , const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal li2 ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal fmod ( const mpreal & x , const mpreal & y , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal rec_sqrt ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
# endif
// MPFR 3.0.0 Specifics
# if (MPFR_VERSION >= MPFR_VERSION_NUM(3,0,0))
friend const mpreal digamma ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal ai ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
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
2012-06-21 15:56:54 +08:00
friend bool isregular ( const mpreal & v ) ;
2011-08-19 21:03:45 +08:00
# endif
2012-06-21 15:56:54 +08:00
// Uniformly distributed random number generation in [0,1] using
// Mersenne-Twister algorithm by default.
// Use parameter to setup seed, e.g.: random((unsigned)time(NULL))
// Check urandom() for more precise control.
friend const mpreal random ( unsigned int seed = 0 ) ;
2011-08-19 21:03:45 +08:00
// Exponent and mantissa manipulation
friend const mpreal frexp ( const mpreal & v , mp_exp_t * exp ) ;
friend const mpreal ldexp ( const mpreal & v , mp_exp_t exp ) ;
// Splits mpreal value into fractional and integer parts.
// Returns fractional part and stores integer part in n.
friend const mpreal modf ( const mpreal & v , mpreal & n ) ;
// Constants
// don't forget to call mpfr_free_cache() for every thread where you are using const-functions
friend const mpreal const_log2 ( mp_prec_t prec = mpreal : : default_prec , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal const_pi ( mp_prec_t prec = mpreal : : default_prec , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal const_euler ( mp_prec_t prec = mpreal : : default_prec , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal const_catalan ( mp_prec_t prec = mpreal : : default_prec , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
// returns +inf iff sign>=0 otherwise -inf
friend const mpreal const_infinity ( int sign = 1 , mp_prec_t prec = mpreal : : default_prec , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
// Output/ Input
friend std : : ostream & operator < < ( std : : ostream & os , const mpreal & v ) ;
friend std : : istream & operator > > ( std : : istream & is , mpreal & v ) ;
// Integer Related Functions
friend const mpreal rint ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal ceil ( const mpreal & v ) ;
friend const mpreal floor ( const mpreal & v ) ;
friend const mpreal round ( const mpreal & v ) ;
friend const mpreal trunc ( const mpreal & v ) ;
friend const mpreal rint_ceil ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal rint_floor ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal rint_round ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal rint_trunc ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal frac ( const mpreal & v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal remainder ( const mpreal & x , const mpreal & y , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
friend const mpreal remquo ( long * q , const mpreal & x , const mpreal & y , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
// Miscellaneous Functions
friend const mpreal nexttoward ( const mpreal & x , const mpreal & y ) ;
friend const mpreal nextabove ( const mpreal & x ) ;
friend const mpreal nextbelow ( const mpreal & x ) ;
// use gmp_randinit_default() to init state, gmp_randclear() to clear
friend const mpreal urandomb ( gmp_randstate_t & state ) ;
// MPFR < 2.4.2 Specifics
# if (MPFR_VERSION <= MPFR_VERSION_NUM(2,4,2))
friend const mpreal random2 ( mp_size_t size , mp_exp_t exp ) ;
# endif
// Instance Checkers
2012-06-21 15:56:54 +08:00
friend bool isnan ( const mpreal & v ) ;
friend bool isinf ( const mpreal & v ) ;
friend bool isfinite ( const mpreal & v ) ;
friend bool isnum ( const mpreal & v ) ;
friend bool iszero ( const mpreal & v ) ;
friend bool isint ( const mpreal & v ) ;
2011-08-19 21:03:45 +08:00
// Set/Get instance properties
inline mp_prec_t get_prec ( ) const ;
2012-06-21 15:56:54 +08:00
inline void set_prec ( mp_prec_t prec , mp_rnd_t rnd_mode = default_rnd ) ; // Change precision with rounding mode
2011-08-19 21:03:45 +08:00
2012-06-21 15:56:54 +08:00
// Aliases for get_prec(), set_prec() - needed for compatibility with std::complex<mpreal> interface
inline mpreal & setPrecision ( int Precision , mp_rnd_t RoundingMode = ( mpfr_get_default_rounding_mode ) ( ) ) ;
inline int getPrecision ( ) const ;
// Set mpreal to +/- inf, NaN, +/-0
mpreal & setInf ( int Sign = + 1 ) ;
mpreal & setNan ( ) ;
mpreal & setZero ( int Sign = + 1 ) ;
mpreal & setSign ( int Sign , mp_rnd_t RoundingMode = ( mpfr_get_default_rounding_mode ) ( ) ) ;
2011-08-19 21:03:45 +08:00
//Exponent
mp_exp_t get_exp ( ) ;
int set_exp ( mp_exp_t e ) ;
int check_range ( int t , mp_rnd_t rnd_mode = default_rnd ) ;
int subnormalize ( int t , mp_rnd_t rnd_mode = default_rnd ) ;
// Inexact conversion from float
inline bool fits_in_bits ( double x , int n ) ;
// Set/Get global properties
static void set_default_prec ( mp_prec_t prec ) ;
static mp_prec_t get_default_prec ( ) ;
static void set_default_base ( int base ) ;
static int get_default_base ( ) ;
static void set_double_bits ( int dbits ) ;
static int get_double_bits ( ) ;
static void set_default_rnd ( mp_rnd_t rnd_mode ) ;
static mp_rnd_t get_default_rnd ( ) ;
2012-06-21 15:56:54 +08:00
static mp_exp_t get_emin ( void ) ;
static mp_exp_t get_emax ( void ) ;
static mp_exp_t get_emin_min ( void ) ;
static mp_exp_t get_emin_max ( void ) ;
static mp_exp_t get_emax_min ( void ) ;
static mp_exp_t get_emax_max ( void ) ;
static int set_emin ( mp_exp_t exp ) ;
static int set_emax ( mp_exp_t exp ) ;
2011-08-19 21:03:45 +08:00
// Efficient swapping of two mpreal values
friend void swap ( mpreal & x , mpreal & y ) ;
//Min Max - macros is evil. Needed for systems which defines max and min globally as macros (e.g. Windows)
//Hope that globally defined macros use > < operations only
friend const mpreal fmax ( const mpreal & x , const mpreal & y , mp_rnd_t rnd_mode = default_rnd ) ;
friend const mpreal fmin ( const mpreal & x , const mpreal & y , mp_rnd_t rnd_mode = default_rnd ) ;
2012-06-21 15:56:54 +08:00
# if defined (MPREAL_HAVE_CUSTOM_MPFR_MALLOC)
2011-08-19 21:03:45 +08:00
private :
// Optimized dynamic memory allocation/(re-)deallocation.
static bool is_custom_malloc ;
static void * mpreal_allocate ( size_t alloc_size ) ;
static void * mpreal_reallocate ( void * ptr , size_t old_size , size_t new_size ) ;
static void mpreal_free ( void * ptr , size_t size ) ;
inline static void set_custom_malloc ( void ) ;
2012-06-21 15:56:54 +08:00
# endif
private :
// Human friendly Debug Preview in Visual Studio.
// Put one of these lines:
//
// mpfr::mpreal=<DebugView> ; Show value only
// mpfr::mpreal=<DebugView>, <mp[0]._mpfr_prec,u>bits ; Show value & precision
//
// at the beginning of
// [Visual Studio Installation Folder]\Common7\Packages\Debugger\autoexp.dat
2012-06-21 15:59:44 +08:00
MPREAL_MSVC_DEBUGVIEW_DATA
2011-08-19 21:03:45 +08:00
} ;
//////////////////////////////////////////////////////////////////////////
// Exceptions
class conversion_overflow : public std : : exception {
public :
std : : string why ( ) { return " inexact conversion from floating point " ; }
} ;
2012-06-21 15:56:54 +08:00
namespace internal {
2011-08-19 21:03:45 +08:00
2012-06-21 15:56:54 +08:00
// Use SFINAE to restrict arithmetic operations instantiation only for numeric types
// This is needed for smooth integration with libraries based on expression templates
template < typename ArgumentType > struct result_type { } ;
template < > struct result_type < mpreal > { typedef mpreal type ; } ;
template < > struct result_type < mpz_t > { typedef mpreal type ; } ;
template < > struct result_type < mpq_t > { typedef mpreal type ; } ;
template < > struct result_type < long double > { typedef mpreal type ; } ;
template < > struct result_type < double > { typedef mpreal type ; } ;
template < > struct result_type < unsigned long int > { typedef mpreal type ; } ;
template < > struct result_type < unsigned int > { typedef mpreal type ; } ;
template < > struct result_type < long int > { typedef mpreal type ; } ;
template < > struct result_type < int > { typedef mpreal type ; } ;
# if defined (MPREAL_HAVE_INT64_SUPPORT)
template < > struct result_type < int64_t > { typedef mpreal type ; } ;
template < > struct result_type < uint64_t > { typedef mpreal type ; } ;
# endif
}
2011-08-19 21:03:45 +08:00
2012-06-21 15:56:54 +08:00
// + Addition
template < typename Rhs >
inline const typename internal : : result_type < Rhs > : : type
operator + ( const mpreal & lhs , const Rhs & rhs ) { return mpreal ( lhs ) + = rhs ; }
2011-08-19 21:03:45 +08:00
2012-06-21 15:56:54 +08:00
template < typename Lhs >
inline const typename internal : : result_type < Lhs > : : type
operator + ( const Lhs & lhs , const mpreal & rhs ) { return mpreal ( rhs ) + = lhs ; }
2011-08-19 21:03:45 +08:00
2012-06-21 15:56:54 +08:00
// - Subtraction
template < typename Rhs >
inline const typename internal : : result_type < Rhs > : : type
operator - ( const mpreal & lhs , const Rhs & rhs ) { return mpreal ( lhs ) - = rhs ; }
2011-08-19 21:03:45 +08:00
2012-06-21 15:56:54 +08:00
template < typename Lhs >
inline const typename internal : : result_type < Lhs > : : type
operator - ( const Lhs & lhs , const mpreal & rhs ) { return mpreal ( lhs ) - = rhs ; }
2011-08-19 21:03:45 +08:00
2012-06-21 15:56:54 +08:00
// * Multiplication
template < typename Rhs >
inline const typename internal : : result_type < Rhs > : : type
operator * ( const mpreal & lhs , const Rhs & rhs ) { return mpreal ( lhs ) * = rhs ; }
2011-08-19 21:03:45 +08:00
2012-06-21 15:56:54 +08:00
template < typename Lhs >
inline const typename internal : : result_type < Lhs > : : type
operator * ( const Lhs & lhs , const mpreal & rhs ) { return mpreal ( rhs ) * = lhs ; }
2011-08-19 21:03:45 +08:00
2012-06-21 15:56:54 +08:00
// / Division
template < typename Rhs >
inline const typename internal : : result_type < Rhs > : : type
operator / ( const mpreal & lhs , const Rhs & rhs ) { return mpreal ( lhs ) / = rhs ; }
template < typename Lhs >
inline const typename internal : : result_type < Lhs > : : type
operator / ( const Lhs & lhs , const mpreal & rhs ) { return mpreal ( lhs ) / = rhs ; }
2011-08-19 21:03:45 +08:00
//////////////////////////////////////////////////////////////////////////
// sqrt
const mpreal sqrt ( const unsigned int v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
const mpreal sqrt ( const long int v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
const mpreal sqrt ( const int v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
const mpreal sqrt ( const long double v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
const mpreal sqrt ( const double v , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
//////////////////////////////////////////////////////////////////////////
// pow
const mpreal pow ( const mpreal & a , const unsigned int b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
const mpreal pow ( const mpreal & a , const int b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
const mpreal pow ( const mpreal & a , const long double b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
const mpreal pow ( const mpreal & a , const double b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
const mpreal pow ( const unsigned int a , const mpreal & b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
const mpreal pow ( const long int a , const mpreal & b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
const mpreal pow ( const int a , const mpreal & b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
const mpreal pow ( const long double a , const mpreal & b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
const mpreal pow ( const double a , const mpreal & b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
const mpreal pow ( const unsigned long int a , const unsigned int b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
const mpreal pow ( const unsigned long int a , const long int b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
const mpreal pow ( const unsigned long int a , const int b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
const mpreal pow ( const unsigned long int a , const long double b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
const mpreal pow ( const unsigned long int a , const double b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
const mpreal pow ( const unsigned int a , const unsigned long int b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
const mpreal pow ( const unsigned int a , const unsigned int b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
const mpreal pow ( const unsigned int a , const long int b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
const mpreal pow ( const unsigned int a , const int b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
const mpreal pow ( const unsigned int a , const long double b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
const mpreal pow ( const unsigned int a , const double b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
const mpreal pow ( const long int a , const unsigned long int b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
const mpreal pow ( const long int a , const unsigned int b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
const mpreal pow ( const long int a , const long int b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
const mpreal pow ( const long int a , const int b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
const mpreal pow ( const long int a , const long double b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
const mpreal pow ( const long int a , const double b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
const mpreal pow ( const int a , const unsigned long int b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
const mpreal pow ( const int a , const unsigned int b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
const mpreal pow ( const int a , const long int b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
const mpreal pow ( const int a , const int b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
const mpreal pow ( const int a , const long double b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
const mpreal pow ( const int a , const double b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
const mpreal pow ( const long double a , const long double b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
const mpreal pow ( const long double a , const unsigned long int b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
const mpreal pow ( const long double a , const unsigned int b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
const mpreal pow ( const long double a , const long int b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
const mpreal pow ( const long double a , const int b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
const mpreal pow ( const double a , const double b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
const mpreal pow ( const double a , const unsigned long int b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
const mpreal pow ( const double a , const unsigned int b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
const mpreal pow ( const double a , const long int b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
const mpreal pow ( const double a , const int b , mp_rnd_t rnd_mode = mpreal : : default_rnd ) ;
//////////////////////////////////////////////////////////////////////////
// Estimate machine epsilon for the given precision
2012-06-21 15:56:54 +08:00
// Returns smallest eps such that 1.0 + eps != 1.0
inline const mpreal machine_epsilon ( mp_prec_t prec = mpreal : : get_default_prec ( ) ) ;
// Returns the positive distance from abs(x) to the next larger in magnitude floating point number of the same precision as x
inline const mpreal machine_epsilon ( const mpreal & x ) ;
inline const mpreal mpreal_min ( mp_prec_t prec = mpreal : : get_default_prec ( ) ) ;
inline const mpreal mpreal_max ( mp_prec_t prec = mpreal : : get_default_prec ( ) ) ;
inline bool isEqualFuzzy ( const mpreal & a , const mpreal & b , const mpreal & eps ) ;
inline bool isEqualUlps ( const mpreal & a , const mpreal & b , int maxUlps ) ;
//////////////////////////////////////////////////////////////////////////
// Bits - decimal digits relation
// bits = ceil(digits*log[2](10))
// digits = floor(bits*log[10](2))
inline mp_prec_t digits2bits ( int d ) ;
inline int bits2digits ( mp_prec_t b ) ;
//////////////////////////////////////////////////////////////////////////
// min, max
2012-06-21 15:59:44 +08:00
const mpreal ( max ) ( const mpreal & x , const mpreal & y ) ;
const mpreal ( min ) ( const mpreal & x , const mpreal & y ) ;
2011-08-19 21:03:45 +08:00
//////////////////////////////////////////////////////////////////////////
2012-06-21 15:56:54 +08:00
// Implementation
2011-08-19 21:03:45 +08:00
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
// Operators - Assignment
inline mpreal & mpreal : : operator = ( const mpreal & v )
{
2012-06-21 15:56:54 +08:00
if ( this ! = & v )
2011-08-19 21:03:45 +08:00
{
2012-06-21 15:56:54 +08:00
mpfr_clear ( mp ) ;
mpfr_init2 ( mp , mpfr_get_prec ( v . mp ) ) ;
2011-08-19 21:03:45 +08:00
mpfr_set ( mp , v . mp , default_rnd ) ;
2012-06-21 15:56:54 +08:00
MPREAL_MSVC_DEBUGVIEW_CODE ;
2011-08-19 21:03:45 +08:00
}
return * this ;
}
inline mpreal & mpreal : : operator = ( const mpf_t v )
{
mpfr_set_f ( mp , v , default_rnd ) ;
2012-06-21 15:56:54 +08:00
MPREAL_MSVC_DEBUGVIEW_CODE ;
2011-08-19 21:03:45 +08:00
return * this ;
}
inline mpreal & mpreal : : operator = ( const mpz_t v )
{
mpfr_set_z ( mp , v , default_rnd ) ;
2012-06-21 15:56:54 +08:00
MPREAL_MSVC_DEBUGVIEW_CODE ;
2011-08-19 21:03:45 +08:00
return * this ;
}
inline mpreal & mpreal : : operator = ( const mpq_t v )
{
mpfr_set_q ( mp , v , default_rnd ) ;
2012-06-21 15:56:54 +08:00
MPREAL_MSVC_DEBUGVIEW_CODE ;
2011-08-19 21:03:45 +08:00
return * this ;
}
inline mpreal & mpreal : : operator = ( const long double v )
{
mpfr_set_ld ( mp , v , default_rnd ) ;
2012-06-21 15:56:54 +08:00
MPREAL_MSVC_DEBUGVIEW_CODE ;
2011-08-19 21:03:45 +08:00
return * this ;
}
inline mpreal & mpreal : : operator = ( const double v )
{
if ( double_bits = = - 1 | | fits_in_bits ( v , double_bits ) )
{
mpfr_set_d ( mp , v , default_rnd ) ;
2012-06-21 15:56:54 +08:00
MPREAL_MSVC_DEBUGVIEW_CODE ;
2011-08-19 21:03:45 +08:00
}
else
throw conversion_overflow ( ) ;
return * this ;
}
inline mpreal & mpreal : : operator = ( const unsigned long int v )
{
mpfr_set_ui ( mp , v , default_rnd ) ;
2012-06-21 15:56:54 +08:00
MPREAL_MSVC_DEBUGVIEW_CODE ;
2011-08-19 21:03:45 +08:00
return * this ;
}
inline mpreal & mpreal : : operator = ( const unsigned int v )
{
mpfr_set_ui ( mp , v , default_rnd ) ;
2012-06-21 15:56:54 +08:00
MPREAL_MSVC_DEBUGVIEW_CODE ;
2011-08-19 21:03:45 +08:00
return * this ;
}
inline mpreal & mpreal : : operator = ( const long int v )
{
mpfr_set_si ( mp , v , default_rnd ) ;
2012-06-21 15:56:54 +08:00
MPREAL_MSVC_DEBUGVIEW_CODE ;
2011-08-19 21:03:45 +08:00
return * this ;
}
inline mpreal & mpreal : : operator = ( const int v )
{
mpfr_set_si ( mp , v , default_rnd ) ;
2012-06-21 15:56:54 +08:00
MPREAL_MSVC_DEBUGVIEW_CODE ;
2011-08-19 21:03:45 +08:00
return * this ;
}
//////////////////////////////////////////////////////////////////////////
// + Addition
inline mpreal & mpreal : : operator + = ( const mpreal & v )
{
mpfr_add ( mp , mp , v . mp , default_rnd ) ;
2012-06-21 15:56:54 +08:00
MPREAL_MSVC_DEBUGVIEW_CODE ;
2011-08-19 21:03:45 +08:00
return * this ;
}
inline mpreal & mpreal : : operator + = ( const mpf_t u )
{
* this + = mpreal ( u ) ;
2012-06-21 15:56:54 +08:00
MPREAL_MSVC_DEBUGVIEW_CODE ;
2011-08-19 21:03:45 +08:00
return * this ;
}
inline mpreal & mpreal : : operator + = ( const mpz_t u )
{
mpfr_add_z ( mp , mp , u , default_rnd ) ;
2012-06-21 15:56:54 +08:00
MPREAL_MSVC_DEBUGVIEW_CODE ;
2011-08-19 21:03:45 +08:00
return * this ;
}
inline mpreal & mpreal : : operator + = ( const mpq_t u )
{
mpfr_add_q ( mp , mp , u , default_rnd ) ;
2012-06-21 15:56:54 +08:00
MPREAL_MSVC_DEBUGVIEW_CODE ;
2011-08-19 21:03:45 +08:00
return * this ;
}
inline mpreal & mpreal : : operator + = ( const long double u )
{
2012-06-21 15:56:54 +08:00
* this + = mpreal ( u ) ;
MPREAL_MSVC_DEBUGVIEW_CODE ;
return * this ;
2011-08-19 21:03:45 +08:00
}
inline mpreal & mpreal : : operator + = ( const double u )
{
# if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0))
mpfr_add_d ( mp , mp , u , default_rnd ) ;
# else
2012-06-21 15:56:54 +08:00
* this + = mpreal ( u ) ;
2011-08-19 21:03:45 +08:00
# endif
2012-06-21 15:56:54 +08:00
MPREAL_MSVC_DEBUGVIEW_CODE ;
return * this ;
2011-08-19 21:03:45 +08:00
}
inline mpreal & mpreal : : operator + = ( const unsigned long int u )
{
mpfr_add_ui ( mp , mp , u , default_rnd ) ;
2012-06-21 15:56:54 +08:00
MPREAL_MSVC_DEBUGVIEW_CODE ;
2011-08-19 21:03:45 +08:00
return * this ;
}
inline mpreal & mpreal : : operator + = ( const unsigned int u )
{
mpfr_add_ui ( mp , mp , u , default_rnd ) ;
2012-06-21 15:56:54 +08:00
MPREAL_MSVC_DEBUGVIEW_CODE ;
2011-08-19 21:03:45 +08:00
return * this ;
}
inline mpreal & mpreal : : operator + = ( const long int u )
{
mpfr_add_si ( mp , mp , u , default_rnd ) ;
2012-06-21 15:56:54 +08:00
MPREAL_MSVC_DEBUGVIEW_CODE ;
2011-08-19 21:03:45 +08:00
return * this ;
}
inline mpreal & mpreal : : operator + = ( const int u )
{
mpfr_add_si ( mp , mp , u , default_rnd ) ;
2012-06-21 15:56:54 +08:00
MPREAL_MSVC_DEBUGVIEW_CODE ;
2011-08-19 21:03:45 +08:00
return * this ;
}
2012-06-21 15:56:54 +08:00
# if defined (MPREAL_HAVE_INT64_SUPPORT)
inline mpreal & mpreal : : operator + = ( const int64_t u ) { * this + = mpreal ( u ) ; MPREAL_MSVC_DEBUGVIEW_CODE ; return * this ; }
inline mpreal & mpreal : : operator + = ( const uint64_t u ) { * this + = mpreal ( u ) ; MPREAL_MSVC_DEBUGVIEW_CODE ; return * this ; }
inline mpreal & mpreal : : operator - = ( const int64_t u ) { * this - = mpreal ( u ) ; MPREAL_MSVC_DEBUGVIEW_CODE ; return * this ; }
inline mpreal & mpreal : : operator - = ( const uint64_t u ) { * this - = mpreal ( u ) ; MPREAL_MSVC_DEBUGVIEW_CODE ; return * this ; }
inline mpreal & mpreal : : operator * = ( const int64_t u ) { * this * = mpreal ( u ) ; MPREAL_MSVC_DEBUGVIEW_CODE ; return * this ; }
inline mpreal & mpreal : : operator * = ( const uint64_t u ) { * this * = mpreal ( u ) ; MPREAL_MSVC_DEBUGVIEW_CODE ; return * this ; }
inline mpreal & mpreal : : operator / = ( const int64_t u ) { * this / = mpreal ( u ) ; MPREAL_MSVC_DEBUGVIEW_CODE ; return * this ; }
inline mpreal & mpreal : : operator / = ( const uint64_t u ) { * this / = mpreal ( u ) ; MPREAL_MSVC_DEBUGVIEW_CODE ; return * this ; }
# endif
inline const mpreal mpreal : : operator + ( ) const { return mpreal ( * this ) ; }
2011-08-19 21:03:45 +08:00
inline const mpreal operator + ( const mpreal & a , const mpreal & b )
{
// prec(a+b) = max(prec(a),prec(b))
if ( a . get_prec ( ) > b . get_prec ( ) ) return mpreal ( a ) + = b ;
else return mpreal ( b ) + = a ;
}
inline mpreal & mpreal : : operator + + ( )
{
2012-06-21 15:56:54 +08:00
return * this + = 1 ;
2011-08-19 21:03:45 +08:00
}
inline const mpreal mpreal : : operator + + ( int )
{
mpreal x ( * this ) ;
* this + = 1 ;
return x ;
}
inline mpreal & mpreal : : operator - - ( )
{
2012-06-21 15:56:54 +08:00
return * this - = 1 ;
2011-08-19 21:03:45 +08:00
}
inline const mpreal mpreal : : operator - - ( int )
{
mpreal x ( * this ) ;
* this - = 1 ;
return x ;
}
//////////////////////////////////////////////////////////////////////////
// - Subtraction
inline mpreal & mpreal : : operator - = ( const mpreal & v )
{
mpfr_sub ( mp , mp , v . mp , default_rnd ) ;
2012-06-21 15:56:54 +08:00
MPREAL_MSVC_DEBUGVIEW_CODE ;
2011-08-19 21:03:45 +08:00
return * this ;
}
inline mpreal & mpreal : : operator - = ( const mpz_t v )
{
mpfr_sub_z ( mp , mp , v , default_rnd ) ;
2012-06-21 15:56:54 +08:00
MPREAL_MSVC_DEBUGVIEW_CODE ;
2011-08-19 21:03:45 +08:00
return * this ;
}
inline mpreal & mpreal : : operator - = ( const mpq_t v )
{
mpfr_sub_q ( mp , mp , v , default_rnd ) ;
2012-06-21 15:56:54 +08:00
MPREAL_MSVC_DEBUGVIEW_CODE ;
2011-08-19 21:03:45 +08:00
return * this ;
}
inline mpreal & mpreal : : operator - = ( const long double v )
{
2012-06-21 15:56:54 +08:00
* this - = mpreal ( v ) ;
MPREAL_MSVC_DEBUGVIEW_CODE ;
return * this ;
2011-08-19 21:03:45 +08:00
}
inline mpreal & mpreal : : operator - = ( const double v )
{
# if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0))
mpfr_sub_d ( mp , mp , v , default_rnd ) ;
# else
2012-06-21 15:56:54 +08:00
* this - = mpreal ( v ) ;
2011-08-19 21:03:45 +08:00
# endif
2012-06-21 15:56:54 +08:00
MPREAL_MSVC_DEBUGVIEW_CODE ;
return * this ;
2011-08-19 21:03:45 +08:00
}
inline mpreal & mpreal : : operator - = ( const unsigned long int v )
{
mpfr_sub_ui ( mp , mp , v , default_rnd ) ;
2012-06-21 15:56:54 +08:00
MPREAL_MSVC_DEBUGVIEW_CODE ;
2011-08-19 21:03:45 +08:00
return * this ;
}
inline mpreal & mpreal : : operator - = ( const unsigned int v )
{
mpfr_sub_ui ( mp , mp , v , default_rnd ) ;
2012-06-21 15:56:54 +08:00
MPREAL_MSVC_DEBUGVIEW_CODE ;
2011-08-19 21:03:45 +08:00
return * this ;
}
inline mpreal & mpreal : : operator - = ( const long int v )
{
mpfr_sub_si ( mp , mp , v , default_rnd ) ;
2012-06-21 15:56:54 +08:00
MPREAL_MSVC_DEBUGVIEW_CODE ;
2011-08-19 21:03:45 +08:00
return * this ;
}
inline mpreal & mpreal : : operator - = ( const int v )
{
mpfr_sub_si ( mp , mp , v , default_rnd ) ;
2012-06-21 15:56:54 +08:00
MPREAL_MSVC_DEBUGVIEW_CODE ;
2011-08-19 21:03:45 +08:00
return * this ;
}
inline const mpreal mpreal : : operator - ( ) const
{
mpreal u ( * this ) ;
mpfr_neg ( u . mp , u . mp , default_rnd ) ;
return u ;
}
inline const mpreal operator - ( const mpreal & a , const mpreal & b )
{
// prec(a-b) = max(prec(a),prec(b))
2012-06-21 15:56:54 +08:00
if ( a . getPrecision ( ) > = b . getPrecision ( ) )
{
return mpreal ( a ) - = b ;
} else {
mpreal x ( a ) ;
x . setPrecision ( b . getPrecision ( ) ) ;
return x - = b ;
}
2011-08-19 21:03:45 +08:00
}
inline const mpreal operator - ( const double b , const mpreal & a )
{
# if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0))
mpreal x ( a ) ;
mpfr_d_sub ( x . mp , b , a . mp , mpreal : : default_rnd ) ;
return x ;
# else
2012-06-21 15:56:54 +08:00
return mpreal ( b ) - = a ;
2011-08-19 21:03:45 +08:00
# endif
}
inline const mpreal operator - ( const unsigned long int b , const mpreal & a )
{
mpreal x ( a ) ;
mpfr_ui_sub ( x . mp , b , a . mp , mpreal : : default_rnd ) ;
return x ;
}
inline const mpreal operator - ( const unsigned int b , const mpreal & a )
{
mpreal x ( a ) ;
mpfr_ui_sub ( x . mp , b , a . mp , mpreal : : default_rnd ) ;
return x ;
}
inline const mpreal operator - ( const long int b , const mpreal & a )
{
mpreal x ( a ) ;
mpfr_si_sub ( x . mp , b , a . mp , mpreal : : default_rnd ) ;
return x ;
}
inline const mpreal operator - ( const int b , const mpreal & a )
{
mpreal x ( a ) ;
mpfr_si_sub ( x . mp , b , a . mp , mpreal : : default_rnd ) ;
return x ;
}
//////////////////////////////////////////////////////////////////////////
// * Multiplication
inline mpreal & mpreal : : operator * = ( const mpreal & v )
{
mpfr_mul ( mp , mp , v . mp , default_rnd ) ;
2012-06-21 15:56:54 +08:00
MPREAL_MSVC_DEBUGVIEW_CODE ;
2011-08-19 21:03:45 +08:00
return * this ;
}
inline mpreal & mpreal : : operator * = ( const mpz_t v )
{
mpfr_mul_z ( mp , mp , v , default_rnd ) ;
2012-06-21 15:56:54 +08:00
MPREAL_MSVC_DEBUGVIEW_CODE ;
2011-08-19 21:03:45 +08:00
return * this ;
}
inline mpreal & mpreal : : operator * = ( const mpq_t v )
{
mpfr_mul_q ( mp , mp , v , default_rnd ) ;
2012-06-21 15:56:54 +08:00
MPREAL_MSVC_DEBUGVIEW_CODE ;
2011-08-19 21:03:45 +08:00
return * this ;
}
inline mpreal & mpreal : : operator * = ( const long double v )
{
2012-06-21 15:56:54 +08:00
* this * = mpreal ( v ) ;
MPREAL_MSVC_DEBUGVIEW_CODE ;
return * this ;
2011-08-19 21:03:45 +08:00
}
inline mpreal & mpreal : : operator * = ( const double v )
{
# if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0))
mpfr_mul_d ( mp , mp , v , default_rnd ) ;
# else
2012-06-21 15:56:54 +08:00
* this * = mpreal ( v ) ;
2011-08-19 21:03:45 +08:00
# endif
2012-06-21 15:56:54 +08:00
MPREAL_MSVC_DEBUGVIEW_CODE ;
2011-08-19 21:03:45 +08:00
return * this ;
}
2012-06-21 15:56:54 +08:00
inline mpreal & mpreal : : operator * = ( const unsigned long int v )
2011-08-19 21:03:45 +08:00
{
mpfr_mul_ui ( mp , mp , v , default_rnd ) ;
2012-06-21 15:56:54 +08:00
MPREAL_MSVC_DEBUGVIEW_CODE ;
2011-08-19 21:03:45 +08:00
return * this ;
}
2012-06-21 15:56:54 +08:00
inline mpreal & mpreal : : operator * = ( const unsigned int v )
2011-08-19 21:03:45 +08:00
{
2012-06-21 15:56:54 +08:00
mpfr_mul_ui ( mp , mp , v , default_rnd ) ;
MPREAL_MSVC_DEBUGVIEW_CODE ;
return * this ;
2011-08-19 21:03:45 +08:00
}
2012-06-21 15:56:54 +08:00
inline mpreal & mpreal : : operator * = ( const long int v )
2011-08-19 21:03:45 +08:00
{
2012-06-21 15:56:54 +08:00
mpfr_mul_si ( mp , mp , v , default_rnd ) ;
MPREAL_MSVC_DEBUGVIEW_CODE ;
return * this ;
2011-08-19 21:03:45 +08:00
}
2012-06-21 15:56:54 +08:00
inline mpreal & mpreal : : operator * = ( const int v )
2011-08-19 21:03:45 +08:00
{
2012-06-21 15:56:54 +08:00
mpfr_mul_si ( mp , mp , v , default_rnd ) ;
MPREAL_MSVC_DEBUGVIEW_CODE ;
return * this ;
2011-08-19 21:03:45 +08:00
}
2012-06-21 15:56:54 +08:00
inline const mpreal operator * ( const mpreal & a , const mpreal & b )
2011-08-19 21:03:45 +08:00
{
2012-06-21 15:56:54 +08:00
// prec(a*b) = max(prec(a),prec(b))
if ( a . getPrecision ( ) > = b . getPrecision ( ) ) return mpreal ( a ) * = b ;
else return mpreal ( b ) * = a ;
2011-08-19 21:03:45 +08:00
}
2012-06-21 15:56:54 +08:00
//////////////////////////////////////////////////////////////////////////
// / Division
inline mpreal & mpreal : : operator / = ( const mpreal & v )
2011-08-19 21:03:45 +08:00
{
2012-06-21 15:56:54 +08:00
mpfr_div ( mp , mp , v . mp , default_rnd ) ;
MPREAL_MSVC_DEBUGVIEW_CODE ;
return * this ;
2011-08-19 21:03:45 +08:00
}
2012-06-21 15:56:54 +08:00
inline mpreal & mpreal : : operator / = ( const mpz_t v )
2011-08-19 21:03:45 +08:00
{
2012-06-21 15:56:54 +08:00
mpfr_div_z ( mp , mp , v , default_rnd ) ;
MPREAL_MSVC_DEBUGVIEW_CODE ;
return * this ;
2011-08-19 21:03:45 +08:00
}
2012-06-21 15:56:54 +08:00
inline mpreal & mpreal : : operator / = ( const mpq_t v )
2011-08-19 21:03:45 +08:00
{
2012-06-21 15:56:54 +08:00
mpfr_div_q ( mp , mp , v , default_rnd ) ;
MPREAL_MSVC_DEBUGVIEW_CODE ;
return * this ;
2011-08-19 21:03:45 +08:00
}
2012-06-21 15:56:54 +08:00
inline mpreal & mpreal : : operator / = ( const long double v )
2011-08-19 21:03:45 +08:00
{
2012-06-21 15:56:54 +08:00
* this / = mpreal ( v ) ;
MPREAL_MSVC_DEBUGVIEW_CODE ;
return * this ;
2011-08-19 21:03:45 +08:00
}
2012-06-21 15:56:54 +08:00
inline mpreal & mpreal : : operator / = ( const double v )
2011-08-19 21:03:45 +08:00
{
2012-06-21 15:56:54 +08:00
# if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0))
mpfr_div_d ( mp , mp , v , default_rnd ) ;
# else
* this / = mpreal ( v ) ;
# endif
MPREAL_MSVC_DEBUGVIEW_CODE ;
return * this ;
2011-08-19 21:03:45 +08:00
}
2012-06-21 15:56:54 +08:00
inline mpreal & mpreal : : operator / = ( const unsigned long int v )
2011-08-19 21:03:45 +08:00
{
2012-06-21 15:56:54 +08:00
mpfr_div_ui ( mp , mp , v , default_rnd ) ;
MPREAL_MSVC_DEBUGVIEW_CODE ;
return * this ;
2011-08-19 21:03:45 +08:00
}
2012-06-21 15:56:54 +08:00
inline mpreal & mpreal : : operator / = ( const unsigned int v )
2011-08-19 21:03:45 +08:00
{
2012-06-21 15:56:54 +08:00
mpfr_div_ui ( mp , mp , v , default_rnd ) ;
MPREAL_MSVC_DEBUGVIEW_CODE ;
return * this ;
2011-08-19 21:03:45 +08:00
}
2012-06-21 15:56:54 +08:00
inline mpreal & mpreal : : operator / = ( const long int v )
2011-08-19 21:03:45 +08:00
{
2012-06-21 15:56:54 +08:00
mpfr_div_si ( mp , mp , v , default_rnd ) ;
MPREAL_MSVC_DEBUGVIEW_CODE ;
return * this ;
2011-08-19 21:03:45 +08:00
}
2012-06-21 15:56:54 +08:00
inline mpreal & mpreal : : operator / = ( const int v )
2011-08-19 21:03:45 +08:00
{
2012-06-21 15:56:54 +08:00
mpfr_div_si ( mp , mp , v , default_rnd ) ;
MPREAL_MSVC_DEBUGVIEW_CODE ;
return * this ;
2011-08-19 21:03:45 +08:00
}
2012-06-21 15:56:54 +08:00
inline const mpreal operator / ( const mpreal & a , const mpreal & b )
2011-08-19 21:03:45 +08:00
{
2012-06-21 15:56:54 +08:00
// prec(a/b) = max(prec(a),prec(b))
if ( a . getPrecision ( ) > = b . getPrecision ( ) )
{
return mpreal ( a ) / = b ;
} else {
mpreal x ( a ) ;
x . setPrecision ( b . getPrecision ( ) ) ;
return x / = b ;
}
2011-08-19 21:03:45 +08:00
}
2012-06-21 15:56:54 +08:00
inline const mpreal operator / ( const unsigned long int b , const mpreal & a )
2011-08-19 21:03:45 +08:00
{
2012-06-21 15:56:54 +08:00
mpreal x ( a ) ;
mpfr_ui_div ( x . mp , b , a . mp , mpreal : : default_rnd ) ;
return x ;
2011-08-19 21:03:45 +08:00
}
2012-06-21 15:56:54 +08:00
inline const mpreal operator / ( const unsigned int b , const mpreal & a )
2011-08-19 21:03:45 +08:00
{
2012-06-21 15:56:54 +08:00
mpreal x ( a ) ;
mpfr_ui_div ( x . mp , b , a . mp , mpreal : : default_rnd ) ;
return x ;
2011-08-19 21:03:45 +08:00
}
2012-06-21 15:56:54 +08:00
inline const mpreal operator / ( const long int b , const mpreal & a )
2011-08-19 21:03:45 +08:00
{
2012-06-21 15:56:54 +08:00
mpreal x ( a ) ;
mpfr_si_div ( x . mp , b , a . mp , mpreal : : default_rnd ) ;
return x ;
2011-08-19 21:03:45 +08:00
}
2012-06-21 15:56:54 +08:00
inline const mpreal operator / ( const int b , const mpreal & a )
2011-08-19 21:03:45 +08:00
{
2012-06-21 15:56:54 +08:00
mpreal x ( a ) ;
mpfr_si_div ( x . mp , b , a . mp , mpreal : : default_rnd ) ;
return x ;
2011-08-19 21:03:45 +08:00
}
2012-06-21 15:56:54 +08:00
inline const mpreal operator / ( const double b , const mpreal & a )
2011-08-19 21:03:45 +08:00
{
2012-06-21 15:56:54 +08:00
# if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0))
mpreal x ( a ) ;
mpfr_d_div ( x . mp , b , a . mp , mpreal : : default_rnd ) ;
return x ;
# else
return mpreal ( b ) / = a ;
# endif
2011-08-19 21:03:45 +08:00
}
2012-06-21 15:56:54 +08:00
//////////////////////////////////////////////////////////////////////////
// Shifts operators - Multiplication/Division by power of 2
inline mpreal & mpreal : : operator < < = ( const unsigned long int u )
2011-08-19 21:03:45 +08:00
{
2012-06-21 15:56:54 +08:00
mpfr_mul_2ui ( mp , mp , u , default_rnd ) ;
MPREAL_MSVC_DEBUGVIEW_CODE ;
return * this ;
2011-08-19 21:03:45 +08:00
}
2012-06-21 15:56:54 +08:00
inline mpreal & mpreal : : operator < < = ( const unsigned int u )
2011-08-19 21:03:45 +08:00
{
2012-06-21 15:56:54 +08:00
mpfr_mul_2ui ( mp , mp , static_cast < unsigned long int > ( u ) , default_rnd ) ;
MPREAL_MSVC_DEBUGVIEW_CODE ;
return * this ;
2011-08-19 21:03:45 +08:00
}
2012-06-21 15:56:54 +08:00
inline mpreal & mpreal : : operator < < = ( const long int u )
2011-08-19 21:03:45 +08:00
{
2012-06-21 15:56:54 +08:00
mpfr_mul_2si ( mp , mp , u , default_rnd ) ;
MPREAL_MSVC_DEBUGVIEW_CODE ;
return * this ;
2011-08-19 21:03:45 +08:00
}
2012-06-21 15:56:54 +08:00
inline mpreal & mpreal : : operator < < = ( const int u )
2011-08-19 21:03:45 +08:00
{
2012-06-21 15:56:54 +08:00
mpfr_mul_2si ( mp , mp , static_cast < long int > ( u ) , default_rnd ) ;
MPREAL_MSVC_DEBUGVIEW_CODE ;
return * this ;
2011-08-19 21:03:45 +08:00
}
2012-06-21 15:56:54 +08:00
inline mpreal & mpreal : : operator > > = ( const unsigned long int u )
2011-08-19 21:03:45 +08:00
{
2012-06-21 15:56:54 +08:00
mpfr_div_2ui ( mp , mp , u , default_rnd ) ;
MPREAL_MSVC_DEBUGVIEW_CODE ;
return * this ;
2011-08-19 21:03:45 +08:00
}
2012-06-21 15:56:54 +08:00
inline mpreal & mpreal : : operator > > = ( const unsigned int u )
2011-08-19 21:03:45 +08:00
{
2012-06-21 15:56:54 +08:00
mpfr_div_2ui ( mp , mp , static_cast < unsigned long int > ( u ) , default_rnd ) ;
MPREAL_MSVC_DEBUGVIEW_CODE ;
return * this ;
2011-08-19 21:03:45 +08:00
}
2012-06-21 15:56:54 +08:00
inline mpreal & mpreal : : operator > > = ( const long int u )
2011-08-19 21:03:45 +08:00
{
2012-06-21 15:56:54 +08:00
mpfr_div_2si ( mp , mp , u , default_rnd ) ;
MPREAL_MSVC_DEBUGVIEW_CODE ;
return * this ;
2011-08-19 21:03:45 +08:00
}
2012-06-21 15:56:54 +08:00
inline mpreal & mpreal : : operator > > = ( const int u )
2011-08-19 21:03:45 +08:00
{
2012-06-21 15:56:54 +08:00
mpfr_div_2si ( mp , mp , static_cast < long int > ( u ) , default_rnd ) ;
MPREAL_MSVC_DEBUGVIEW_CODE ;
return * this ;
2011-08-19 21:03:45 +08:00
}
2012-06-21 15:56:54 +08:00
inline const mpreal operator < < ( const mpreal & v , const unsigned long int k )
2011-08-19 21:03:45 +08:00
{
2012-06-21 15:56:54 +08:00
return mul_2ui ( v , k ) ;
2011-08-19 21:03:45 +08:00
}
2012-06-21 15:56:54 +08:00
inline const mpreal operator < < ( const mpreal & v , const unsigned int k )
2011-08-19 21:03:45 +08:00
{
2012-06-21 15:56:54 +08:00
return mul_2ui ( v , static_cast < unsigned long int > ( k ) ) ;
2011-08-19 21:03:45 +08:00
}
2012-06-21 15:56:54 +08:00
inline const mpreal operator < < ( const mpreal & v , const long int k )
2011-08-19 21:03:45 +08:00
{
2012-06-21 15:56:54 +08:00
return mul_2si ( v , k ) ;
2011-08-19 21:03:45 +08:00
}
2012-06-21 15:56:54 +08:00
inline const mpreal operator < < ( const mpreal & v , const int k )
2011-08-19 21:03:45 +08:00
{
2012-06-21 15:56:54 +08:00
return mul_2si ( v , static_cast < long int > ( k ) ) ;
2011-08-19 21:03:45 +08:00
}
2012-06-21 15:56:54 +08:00
inline const mpreal operator > > ( const mpreal & v , const unsigned long int k )
2011-08-19 21:03:45 +08:00
{
2012-06-21 15:56:54 +08:00
return div_2ui ( v , k ) ;
2011-08-19 21:03:45 +08:00
}
2012-06-21 15:56:54 +08:00
inline const mpreal operator > > ( const mpreal & v , const long int k )
2011-08-19 21:03:45 +08:00
{
2012-06-21 15:56:54 +08:00
return div_2si ( v , k ) ;
2011-08-19 21:03:45 +08:00
}
2012-06-21 15:56:54 +08:00
inline const mpreal operator > > ( const mpreal & v , const unsigned int k )
2011-08-19 21:03:45 +08:00
{
2012-06-21 15:56:54 +08:00
return div_2ui ( v , static_cast < unsigned long int > ( k ) ) ;
2011-08-19 21:03:45 +08:00
}
2012-06-21 15:56:54 +08:00
inline const mpreal operator > > ( const mpreal & v , const int k )
2011-08-19 21:03:45 +08:00
{
2012-06-21 15:56:54 +08:00
return div_2si ( v , static_cast < long int > ( k ) ) ;
2011-08-19 21:03:45 +08:00
}
2012-06-21 15:56:54 +08:00
// mul_2ui
inline const mpreal mul_2ui ( const mpreal & v , unsigned long int k , mp_rnd_t rnd_mode )
2011-08-19 21:03:45 +08:00
{
2012-06-21 15:56:54 +08:00
mpreal x ( v ) ;
mpfr_mul_2ui ( x . mp , v . mp , k , rnd_mode ) ;
return x ;
2011-08-19 21:03:45 +08:00
}
2012-06-21 15:56:54 +08:00
// mul_2si
inline const mpreal mul_2si ( const mpreal & v , long int k , mp_rnd_t rnd_mode )
2011-08-19 21:03:45 +08:00
{
2012-06-21 15:56:54 +08:00
mpreal x ( v ) ;
mpfr_mul_2si ( x . mp , v . mp , k , rnd_mode ) ;
return x ;
2011-08-19 21:03:45 +08:00
}
2012-06-21 15:56:54 +08:00
inline const mpreal div_2ui ( const mpreal & v , unsigned long int k , mp_rnd_t rnd_mode )
2011-08-19 21:03:45 +08:00
{
2012-06-21 15:56:54 +08:00
mpreal x ( v ) ;
mpfr_div_2ui ( x . mp , v . mp , k , rnd_mode ) ;
return x ;
2011-08-19 21:03:45 +08:00
}
2012-06-21 15:56:54 +08:00
inline const mpreal div_2si ( const mpreal & v , long int k , mp_rnd_t rnd_mode )
2011-08-19 21:03:45 +08:00
{
2012-06-21 15:56:54 +08:00
mpreal x ( v ) ;
mpfr_div_2si ( x . mp , v . mp , k , rnd_mode ) ;
return x ;
2011-08-19 21:03:45 +08:00
}
2012-06-21 15:56:54 +08:00
//////////////////////////////////////////////////////////////////////////
//Boolean operators
inline bool operator > ( const mpreal & a , const mpreal & b ) { return ( mpfr_greater_p ( a . mp , b . mp ) ! = 0 ) ; }
inline bool operator > = ( const mpreal & a , const mpreal & b ) { return ( mpfr_greaterequal_p ( a . mp , b . mp ) ! = 0 ) ; }
inline bool operator < ( const mpreal & a , const mpreal & b ) { return ( mpfr_less_p ( a . mp , b . mp ) ! = 0 ) ; }
inline bool operator < = ( const mpreal & a , const mpreal & b ) { return ( mpfr_lessequal_p ( a . mp , b . mp ) ! = 0 ) ; }
inline bool operator = = ( const mpreal & a , const mpreal & b ) { return ( mpfr_equal_p ( a . mp , b . mp ) ! = 0 ) ; }
inline bool operator ! = ( const mpreal & a , const mpreal & b ) { return ( mpfr_lessgreater_p ( a . mp , b . mp ) ! = 0 ) ; }
inline bool operator = = ( const mpreal & a , const unsigned long int b ) { return ( mpfr_cmp_ui ( a . mp , b ) = = 0 ) ; }
inline bool operator = = ( const mpreal & a , const unsigned int b ) { return ( mpfr_cmp_ui ( a . mp , b ) = = 0 ) ; }
inline bool operator = = ( const mpreal & a , const long int b ) { return ( mpfr_cmp_si ( a . mp , b ) = = 0 ) ; }
inline bool operator = = ( const mpreal & a , const int b ) { return ( mpfr_cmp_si ( a . mp , b ) = = 0 ) ; }
inline bool operator = = ( const mpreal & a , const long double b ) { return ( mpfr_cmp_ld ( a . mp , b ) = = 0 ) ; }
inline bool operator = = ( const mpreal & a , const double b ) { return ( mpfr_cmp_d ( a . mp , b ) = = 0 ) ; }
inline bool isnan ( const mpreal & v ) { return ( mpfr_nan_p ( v . mp ) ! = 0 ) ; }
inline bool isinf ( const mpreal & v ) { return ( mpfr_inf_p ( v . mp ) ! = 0 ) ; }
inline bool isfinite ( const mpreal & v ) { return ( mpfr_number_p ( v . mp ) ! = 0 ) ; }
inline bool iszero ( const mpreal & v ) { return ( mpfr_zero_p ( v . mp ) ! = 0 ) ; }
inline bool isint ( const mpreal & v ) { return ( mpfr_integer_p ( v . mp ) ! = 0 ) ; }
2011-08-19 21:03:45 +08:00
# if (MPFR_VERSION >= MPFR_VERSION_NUM(3,0,0))
2012-06-21 15:56:54 +08:00
inline bool isregular ( const mpreal & v ) { return ( mpfr_regular_p ( v . mp ) ) ; }
# endif
2011-08-19 21:03:45 +08:00
//////////////////////////////////////////////////////////////////////////
// Type Converters
2012-06-21 15:56:54 +08:00
inline long mpreal : : toLong ( ) const { return mpfr_get_si ( mp , GMP_RNDZ ) ; }
inline unsigned long mpreal : : toULong ( ) const { return mpfr_get_ui ( mp , GMP_RNDZ ) ; }
inline double mpreal : : toDouble ( ) const { return mpfr_get_d ( mp , default_rnd ) ; }
inline long double mpreal : : toLDouble ( ) const { return mpfr_get_ld ( mp , default_rnd ) ; }
# if defined (MPREAL_HAVE_INT64_SUPPORT)
inline int64_t mpreal : : toInt64 ( ) const { return mpfr_get_sj ( mp , GMP_RNDZ ) ; }
inline uint64_t mpreal : : toUInt64 ( ) const { return mpfr_get_uj ( mp , GMP_RNDZ ) ; }
# endif
2011-08-19 21:03:45 +08:00
2012-06-21 15:56:54 +08:00
inline : : mpfr_ptr mpreal : : mpfr_ptr ( ) { return mp ; }
inline : : mpfr_srcptr mpreal : : mpfr_srcptr ( ) const { return const_cast < : : mpfr_srcptr > ( mp ) ; }
2011-08-19 21:03:45 +08:00
2012-06-21 15:56:54 +08:00
//////////////////////////////////////////////////////////////////////////
// Bits - decimal digits relation
// bits = ceil(digits*log[2](10))
// digits = floor(bits*log[10](2))
2011-08-19 21:03:45 +08:00
2012-06-21 15:56:54 +08:00
inline mp_prec_t digits2bits ( int d )
2011-08-19 21:03:45 +08:00
{
2012-06-21 15:56:54 +08:00
const double LOG2_10 = 3.3219280948873624 ;
2011-08-19 21:03:45 +08:00
2012-06-21 15:56:54 +08:00
d = 10 > d ? 10 : d ;
2011-08-19 21:03:45 +08:00
2012-06-21 15:56:54 +08:00
return ( mp_prec_t ) std : : ceil ( ( d ) * LOG2_10 ) ;
2011-08-19 21:03:45 +08:00
}
2012-06-21 15:56:54 +08:00
inline int bits2digits ( mp_prec_t b )
2011-08-19 21:03:45 +08:00
{
2012-06-21 15:56:54 +08:00
const double LOG10_2 = 0.30102999566398119 ;
2011-08-19 21:03:45 +08:00
2012-06-21 15:56:54 +08:00
b = 34 > b ? 34 : b ;
return ( int ) std : : floor ( ( b ) * LOG10_2 ) ;
2011-08-19 21:03:45 +08:00
}
//////////////////////////////////////////////////////////////////////////
// Set/Get number properties
inline int sgn ( const mpreal & v )
{
int r = mpfr_signbit ( v . mp ) ;
return ( r > 0 ? - 1 : 1 ) ;
}
2012-06-21 15:56:54 +08:00
inline mpreal & mpreal : : setSign ( int sign , mp_rnd_t RoundingMode )
2011-08-19 21:03:45 +08:00
{
2012-06-21 15:56:54 +08:00
mpfr_setsign ( mp , mp , ( sign < 0 ? 1 : 0 ) , RoundingMode ) ;
MPREAL_MSVC_DEBUGVIEW_CODE ;
return * this ;
2011-08-19 21:03:45 +08:00
}
2012-06-21 15:56:54 +08:00
inline int mpreal : : getPrecision ( ) const
2011-08-19 21:03:45 +08:00
{
return mpfr_get_prec ( mp ) ;
}
2012-06-21 15:56:54 +08:00
inline mpreal & mpreal : : setPrecision ( int Precision , mp_rnd_t RoundingMode )
2011-08-19 21:03:45 +08:00
{
2012-06-21 15:56:54 +08:00
mpfr_prec_round ( mp , Precision , RoundingMode ) ;
MPREAL_MSVC_DEBUGVIEW_CODE ;
return * this ;
2011-08-19 21:03:45 +08:00
}
2012-06-21 15:56:54 +08:00
inline mpreal & mpreal : : setInf ( int sign )
2011-08-19 21:03:45 +08:00
{
mpfr_set_inf ( mp , sign ) ;
2012-06-21 15:56:54 +08:00
MPREAL_MSVC_DEBUGVIEW_CODE ;
return * this ;
2011-08-19 21:03:45 +08:00
}
2012-06-21 15:56:54 +08:00
inline mpreal & mpreal : : setNan ( )
2011-08-19 21:03:45 +08:00
{
mpfr_set_nan ( mp ) ;
2012-06-21 15:56:54 +08:00
MPREAL_MSVC_DEBUGVIEW_CODE ;
return * this ;
}
inline mpreal & mpreal : : setZero ( int sign )
{
mpfr_set_zero ( mp , sign ) ;
MPREAL_MSVC_DEBUGVIEW_CODE ;
return * this ;
}
inline mp_prec_t mpreal : : get_prec ( ) const
{
return mpfr_get_prec ( mp ) ;
}
inline void mpreal : : set_prec ( mp_prec_t prec , mp_rnd_t rnd_mode )
{
mpfr_prec_round ( mp , prec , rnd_mode ) ;
MPREAL_MSVC_DEBUGVIEW_CODE ;
2011-08-19 21:03:45 +08:00
}
inline mp_exp_t mpreal : : get_exp ( )
{
return mpfr_get_exp ( mp ) ;
}
inline int mpreal : : set_exp ( mp_exp_t e )
{
2012-06-21 15:56:54 +08:00
int x = mpfr_set_exp ( mp , e ) ;
MPREAL_MSVC_DEBUGVIEW_CODE ;
return x ;
2011-08-19 21:03:45 +08:00
}
inline const mpreal frexp ( const mpreal & v , mp_exp_t * exp )
{
mpreal x ( v ) ;
* exp = x . get_exp ( ) ;
x . set_exp ( 0 ) ;
return x ;
}
inline const mpreal ldexp ( const mpreal & v , mp_exp_t exp )
{
mpreal x ( v ) ;
// rounding is not important since we just increasing the exponent
mpfr_mul_2si ( x . mp , x . mp , exp , mpreal : : default_rnd ) ;
return x ;
}
inline const mpreal machine_epsilon ( mp_prec_t prec )
{
// the smallest eps such that 1.0+eps != 1.0
// depends (of cause) on the precision
2012-06-21 15:56:54 +08:00
return machine_epsilon ( mpreal ( 1 , prec ) ) ;
}
inline const mpreal machine_epsilon ( const mpreal & x )
{
if ( x < 0 )
{
return nextabove ( - x ) + x ;
} else {
return nextabove ( x ) - x ;
}
2011-08-19 21:03:45 +08:00
}
inline const mpreal mpreal_min ( mp_prec_t prec )
{
// min = 1/2*2^emin = 2^(emin-1)
2012-06-21 15:56:54 +08:00
return mpreal ( 1 , prec ) < < mpreal : : get_emin ( ) - 1 ;
2011-08-19 21:03:45 +08:00
}
inline const mpreal mpreal_max ( mp_prec_t prec )
{
// max = (1-eps)*2^emax, assume eps = 0?,
// and use emax-1 to prevent value to be +inf
// max = 2^(emax-1)
2012-06-21 15:56:54 +08:00
return mpreal ( 1 , prec ) < < mpreal : : get_emax ( ) - 1 ;
}
inline bool isEqualUlps ( const mpreal & a , const mpreal & b , int maxUlps )
{
/*
maxUlps - a and b can be apart by maxUlps binary numbers .
*/
2012-06-21 15:59:44 +08:00
return abs ( a - b ) < = machine_epsilon ( ( max ) ( abs ( a ) , abs ( b ) ) ) * maxUlps ;
2012-06-21 15:56:54 +08:00
}
inline bool isEqualFuzzy ( const mpreal & a , const mpreal & b , const mpreal & eps )
{
return abs ( a - b ) < = ( min ) ( abs ( a ) , abs ( b ) ) * eps ;
}
inline bool isEqualFuzzy ( const mpreal & a , const mpreal & b )
{
return isEqualFuzzy ( a , b , machine_epsilon ( ( std : : min ) ( abs ( a ) , abs ( b ) ) ) ) ;
2011-08-19 21:03:45 +08:00
}
inline const mpreal modf ( const mpreal & v , mpreal & n )
{
mpreal frac ( v ) ;
// rounding is not important since we are using the same number
mpfr_frac ( frac . mp , frac . mp , mpreal : : default_rnd ) ;
mpfr_trunc ( n . mp , v . mp ) ;
return frac ;
}
inline int mpreal : : check_range ( int t , mp_rnd_t rnd_mode )
{
return mpfr_check_range ( mp , t , rnd_mode ) ;
}
inline int mpreal : : subnormalize ( int t , mp_rnd_t rnd_mode )
{
2012-06-21 15:56:54 +08:00
int r = mpfr_subnormalize ( mp , t , rnd_mode ) ;
MPREAL_MSVC_DEBUGVIEW_CODE ;
return r ;
2011-08-19 21:03:45 +08:00
}
inline mp_exp_t mpreal : : get_emin ( void )
{
return mpfr_get_emin ( ) ;
}
inline int mpreal : : set_emin ( mp_exp_t exp )
{
return mpfr_set_emin ( exp ) ;
}
inline mp_exp_t mpreal : : get_emax ( void )
{
return mpfr_get_emax ( ) ;
}
inline int mpreal : : set_emax ( mp_exp_t exp )
{
return mpfr_set_emax ( exp ) ;
}
inline mp_exp_t mpreal : : get_emin_min ( void )
{
return mpfr_get_emin_min ( ) ;
}
inline mp_exp_t mpreal : : get_emin_max ( void )
{
return mpfr_get_emin_max ( ) ;
}
inline mp_exp_t mpreal : : get_emax_min ( void )
{
return mpfr_get_emax_min ( ) ;
}
inline mp_exp_t mpreal : : get_emax_max ( void )
{
return mpfr_get_emax_max ( ) ;
}
//////////////////////////////////////////////////////////////////////////
// Mathematical Functions
//////////////////////////////////////////////////////////////////////////
inline const mpreal sqr ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_sqr ( x . mp , x . mp , rnd_mode ) ;
return x ;
}
inline const mpreal sqrt ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_sqrt ( x . mp , x . mp , rnd_mode ) ;
return x ;
}
inline const mpreal sqrt ( const unsigned long int v , mp_rnd_t rnd_mode )
{
mpreal x ;
mpfr_sqrt_ui ( x . mp , v , rnd_mode ) ;
return x ;
}
inline const mpreal sqrt ( const unsigned int v , mp_rnd_t rnd_mode )
{
return sqrt ( static_cast < unsigned long int > ( v ) , rnd_mode ) ;
}
inline const mpreal sqrt ( const long int v , mp_rnd_t rnd_mode )
{
if ( v > = 0 ) return sqrt ( static_cast < unsigned long int > ( v ) , rnd_mode ) ;
2012-06-21 15:56:54 +08:00
else return mpreal ( ) . setNan ( ) ; // NaN
2011-08-19 21:03:45 +08:00
}
inline const mpreal sqrt ( const int v , mp_rnd_t rnd_mode )
{
if ( v > = 0 ) return sqrt ( static_cast < unsigned long int > ( v ) , rnd_mode ) ;
2012-06-21 15:56:54 +08:00
else return mpreal ( ) . setNan ( ) ; // NaN
2011-08-19 21:03:45 +08:00
}
inline const mpreal sqrt ( const long double v , mp_rnd_t rnd_mode )
{
return sqrt ( mpreal ( v ) , rnd_mode ) ;
}
inline const mpreal sqrt ( const double v , mp_rnd_t rnd_mode )
{
return sqrt ( mpreal ( v ) , rnd_mode ) ;
}
inline const mpreal cbrt ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_cbrt ( x . mp , x . mp , rnd_mode ) ;
return x ;
}
inline const mpreal root ( const mpreal & v , unsigned long int k , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_root ( x . mp , x . mp , k , rnd_mode ) ;
return x ;
}
inline const mpreal fabs ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_abs ( x . mp , x . mp , rnd_mode ) ;
return x ;
}
inline const mpreal abs ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_abs ( x . mp , x . mp , rnd_mode ) ;
return x ;
}
inline const mpreal dim ( const mpreal & a , const mpreal & b , mp_rnd_t rnd_mode )
{
mpreal x ( a ) ;
mpfr_dim ( x . mp , a . mp , b . mp , rnd_mode ) ;
return x ;
}
inline int cmpabs ( const mpreal & a , const mpreal & b )
{
return mpfr_cmpabs ( a . mp , b . mp ) ;
}
inline const mpreal log ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_log ( x . mp , v . mp , rnd_mode ) ;
return x ;
}
inline const mpreal log2 ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_log2 ( x . mp , v . mp , rnd_mode ) ;
return x ;
}
inline const mpreal log10 ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_log10 ( x . mp , v . mp , rnd_mode ) ;
return x ;
}
inline const mpreal exp ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_exp ( x . mp , v . mp , rnd_mode ) ;
return x ;
}
inline const mpreal exp2 ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_exp2 ( x . mp , v . mp , rnd_mode ) ;
return x ;
}
inline const mpreal exp10 ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_exp10 ( x . mp , v . mp , rnd_mode ) ;
return x ;
}
inline const mpreal cos ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_cos ( x . mp , v . mp , rnd_mode ) ;
return x ;
}
inline const mpreal sin ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_sin ( x . mp , v . mp , rnd_mode ) ;
return x ;
}
inline const mpreal tan ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_tan ( x . mp , v . mp , rnd_mode ) ;
return x ;
}
inline const mpreal sec ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_sec ( x . mp , v . mp , rnd_mode ) ;
return x ;
}
inline const mpreal csc ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_csc ( x . mp , v . mp , rnd_mode ) ;
return x ;
}
inline const mpreal cot ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_cot ( x . mp , v . mp , rnd_mode ) ;
return x ;
}
inline int sin_cos ( mpreal & s , mpreal & c , const mpreal & v , mp_rnd_t rnd_mode )
{
return mpfr_sin_cos ( s . mp , c . mp , v . mp , rnd_mode ) ;
}
inline const mpreal acos ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_acos ( x . mp , v . mp , rnd_mode ) ;
return x ;
}
inline const mpreal asin ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_asin ( x . mp , v . mp , rnd_mode ) ;
return x ;
}
inline const mpreal atan ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_atan ( x . mp , v . mp , rnd_mode ) ;
return x ;
}
2012-06-21 15:56:54 +08:00
inline const mpreal acot ( const mpreal & v , mp_rnd_t rnd_mode )
{
return atan ( 1 / v , rnd_mode ) ;
}
inline const mpreal asec ( const mpreal & v , mp_rnd_t rnd_mode )
{
return acos ( 1 / v , rnd_mode ) ;
}
inline const mpreal acsc ( const mpreal & v , mp_rnd_t rnd_mode )
{
return asin ( 1 / v , rnd_mode ) ;
}
inline const mpreal acoth ( const mpreal & v , mp_rnd_t rnd_mode )
{
return atanh ( 1 / v , rnd_mode ) ;
}
inline const mpreal asech ( const mpreal & v , mp_rnd_t rnd_mode )
{
return acosh ( 1 / v , rnd_mode ) ;
}
inline const mpreal acsch ( const mpreal & v , mp_rnd_t rnd_mode )
{
return asinh ( 1 / v , rnd_mode ) ;
}
2011-08-19 21:03:45 +08:00
inline const mpreal atan2 ( const mpreal & y , const mpreal & x , mp_rnd_t rnd_mode )
{
mpreal a ;
mp_prec_t yp , xp ;
yp = y . get_prec ( ) ;
xp = x . get_prec ( ) ;
a . set_prec ( yp > xp ? yp : xp ) ;
mpfr_atan2 ( a . mp , y . mp , x . mp , rnd_mode ) ;
return a ;
}
inline const mpreal cosh ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_cosh ( x . mp , v . mp , rnd_mode ) ;
return x ;
}
inline const mpreal sinh ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_sinh ( x . mp , v . mp , rnd_mode ) ;
return x ;
}
inline const mpreal tanh ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_tanh ( x . mp , v . mp , rnd_mode ) ;
return x ;
}
inline const mpreal sech ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_sech ( x . mp , v . mp , rnd_mode ) ;
return x ;
}
inline const mpreal csch ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_csch ( x . mp , v . mp , rnd_mode ) ;
return x ;
}
inline const mpreal coth ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_coth ( x . mp , v . mp , rnd_mode ) ;
return x ;
}
inline const mpreal acosh ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_acosh ( x . mp , v . mp , rnd_mode ) ;
return x ;
}
inline const mpreal asinh ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_asinh ( x . mp , v . mp , rnd_mode ) ;
return x ;
}
inline const mpreal atanh ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_atanh ( x . mp , v . mp , rnd_mode ) ;
return x ;
}
2012-06-21 15:56:54 +08:00
inline const mpreal hypot ( const mpreal & x , const mpreal & y , mp_rnd_t rnd_mode )
{
mpreal a ;
mp_prec_t yp , xp ;
yp = y . get_prec ( ) ;
xp = x . get_prec ( ) ;
a . set_prec ( yp > xp ? yp : xp ) ;
mpfr_hypot ( a . mp , x . mp , y . mp , rnd_mode ) ;
return a ;
}
inline const mpreal remainder ( const mpreal & x , const mpreal & y , mp_rnd_t rnd_mode )
{
mpreal a ;
mp_prec_t yp , xp ;
yp = y . get_prec ( ) ;
xp = x . get_prec ( ) ;
a . set_prec ( yp > xp ? yp : xp ) ;
mpfr_remainder ( a . mp , x . mp , y . mp , rnd_mode ) ;
return a ;
}
2011-08-19 21:03:45 +08:00
inline const mpreal fac_ui ( unsigned long int v , mp_prec_t prec , mp_rnd_t rnd_mode )
{
mpreal x ( 0 , prec ) ;
mpfr_fac_ui ( x . mp , v , rnd_mode ) ;
return x ;
}
inline const mpreal log1p ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_log1p ( x . mp , v . mp , rnd_mode ) ;
return x ;
}
inline const mpreal expm1 ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_expm1 ( x . mp , v . mp , rnd_mode ) ;
return x ;
}
inline const mpreal eint ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_eint ( x . mp , v . mp , rnd_mode ) ;
return x ;
}
2012-06-21 15:56:54 +08:00
inline const mpreal gamma ( const mpreal & x , mp_rnd_t rnd_mode )
2011-08-19 21:03:45 +08:00
{
2012-06-21 15:56:54 +08:00
mpreal FunctionValue ( x ) ;
// x < 0: gamma(-x) = -pi/(x * gamma(x) * sin(pi*x))
mpfr_gamma ( FunctionValue . mp , x . mp , rnd_mode ) ;
return FunctionValue ;
2011-08-19 21:03:45 +08:00
}
inline const mpreal lngamma ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_lngamma ( x . mp , v . mp , rnd_mode ) ;
return x ;
}
inline const mpreal lgamma ( const mpreal & v , int * signp , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
int tsignp ;
if ( signp )
mpfr_lgamma ( x . mp , signp , v . mp , rnd_mode ) ;
else
mpfr_lgamma ( x . mp , & tsignp , v . mp , rnd_mode ) ;
return x ;
}
inline const mpreal zeta ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_zeta ( x . mp , v . mp , rnd_mode ) ;
return x ;
}
inline const mpreal erf ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_erf ( x . mp , v . mp , rnd_mode ) ;
return x ;
}
inline const mpreal erfc ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_erfc ( x . mp , v . mp , rnd_mode ) ;
return x ;
}
2012-06-21 15:56:54 +08:00
inline const mpreal besselj0 ( const mpreal & v , mp_rnd_t rnd_mode )
2011-08-19 21:03:45 +08:00
{
mpreal x ( v ) ;
mpfr_j0 ( x . mp , v . mp , rnd_mode ) ;
return x ;
}
2012-06-21 15:56:54 +08:00
inline const mpreal besselj1 ( const mpreal & v , mp_rnd_t rnd_mode )
2011-08-19 21:03:45 +08:00
{
mpreal x ( v ) ;
mpfr_j1 ( x . mp , v . mp , rnd_mode ) ;
return x ;
}
2012-06-21 15:56:54 +08:00
inline const mpreal besseljn ( long n , const mpreal & v , mp_rnd_t rnd_mode )
2011-08-19 21:03:45 +08:00
{
mpreal x ( v ) ;
mpfr_jn ( x . mp , n , v . mp , rnd_mode ) ;
return x ;
}
2012-06-21 15:56:54 +08:00
inline const mpreal bessely0 ( const mpreal & v , mp_rnd_t rnd_mode )
2011-08-19 21:03:45 +08:00
{
mpreal x ( v ) ;
mpfr_y0 ( x . mp , v . mp , rnd_mode ) ;
return x ;
}
2012-06-21 15:56:54 +08:00
inline const mpreal bessely1 ( const mpreal & v , mp_rnd_t rnd_mode )
2011-08-19 21:03:45 +08:00
{
mpreal x ( v ) ;
mpfr_y1 ( x . mp , v . mp , rnd_mode ) ;
return x ;
}
2012-06-21 15:56:54 +08:00
inline const mpreal besselyn ( long n , const mpreal & v , mp_rnd_t rnd_mode )
2011-08-19 21:03:45 +08:00
{
mpreal x ( v ) ;
mpfr_yn ( x . mp , n , v . mp , rnd_mode ) ;
return x ;
}
//////////////////////////////////////////////////////////////////////////
// MPFR 2.4.0 Specifics
# if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0))
inline int sinh_cosh ( mpreal & s , mpreal & c , const mpreal & v , mp_rnd_t rnd_mode )
{
return mpfr_sinh_cosh ( s . mp , c . mp , v . mp , rnd_mode ) ;
}
inline const mpreal li2 ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_li2 ( x . mp , v . mp , rnd_mode ) ;
return x ;
}
inline const mpreal fmod ( const mpreal & x , const mpreal & y , mp_rnd_t rnd_mode )
{
mpreal a ;
mp_prec_t yp , xp ;
yp = y . get_prec ( ) ;
xp = x . get_prec ( ) ;
a . set_prec ( yp > xp ? yp : xp ) ;
mpfr_fmod ( a . mp , x . mp , y . mp , rnd_mode ) ;
return a ;
}
inline const mpreal rec_sqrt ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_rec_sqrt ( x . mp , v . mp , rnd_mode ) ;
return x ;
}
# endif // MPFR 2.4.0 Specifics
//////////////////////////////////////////////////////////////////////////
// MPFR 3.0.0 Specifics
# if (MPFR_VERSION >= MPFR_VERSION_NUM(3,0,0))
inline const mpreal digamma ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_digamma ( x . mp , v . mp , rnd_mode ) ;
return x ;
}
inline const mpreal ai ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_ai ( x . mp , v . mp , rnd_mode ) ;
return x ;
}
# endif // MPFR 3.0.0 Specifics
//////////////////////////////////////////////////////////////////////////
// Constants
inline const mpreal const_log2 ( mp_prec_t prec , mp_rnd_t rnd_mode )
{
mpreal x ;
x . set_prec ( prec ) ;
mpfr_const_log2 ( x . mp , rnd_mode ) ;
return x ;
}
inline const mpreal const_pi ( mp_prec_t prec , mp_rnd_t rnd_mode )
{
mpreal x ;
x . set_prec ( prec ) ;
mpfr_const_pi ( x . mp , rnd_mode ) ;
return x ;
}
inline const mpreal const_euler ( mp_prec_t prec , mp_rnd_t rnd_mode )
{
mpreal x ;
x . set_prec ( prec ) ;
mpfr_const_euler ( x . mp , rnd_mode ) ;
return x ;
}
inline const mpreal const_catalan ( mp_prec_t prec , mp_rnd_t rnd_mode )
{
mpreal x ;
x . set_prec ( prec ) ;
mpfr_const_catalan ( x . mp , rnd_mode ) ;
return x ;
}
inline const mpreal const_infinity ( int sign , mp_prec_t prec , mp_rnd_t rnd_mode )
{
mpreal x ;
x . set_prec ( prec , rnd_mode ) ;
mpfr_set_inf ( x . mp , sign ) ;
return x ;
}
//////////////////////////////////////////////////////////////////////////
// Integer Related Functions
inline const mpreal rint ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_rint ( x . mp , v . mp , rnd_mode ) ;
return x ;
}
inline const mpreal ceil ( const mpreal & v )
{
mpreal x ( v ) ;
mpfr_ceil ( x . mp , v . mp ) ;
return x ;
}
inline const mpreal floor ( const mpreal & v )
{
mpreal x ( v ) ;
mpfr_floor ( x . mp , v . mp ) ;
return x ;
}
inline const mpreal round ( const mpreal & v )
{
mpreal x ( v ) ;
mpfr_round ( x . mp , v . mp ) ;
return x ;
}
inline const mpreal trunc ( const mpreal & v )
{
mpreal x ( v ) ;
mpfr_trunc ( x . mp , v . mp ) ;
return x ;
}
inline const mpreal rint_ceil ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_rint_ceil ( x . mp , v . mp , rnd_mode ) ;
return x ;
}
inline const mpreal rint_floor ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_rint_floor ( x . mp , v . mp , rnd_mode ) ;
return x ;
}
inline const mpreal rint_round ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_rint_round ( x . mp , v . mp , rnd_mode ) ;
return x ;
}
inline const mpreal rint_trunc ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_rint_trunc ( x . mp , v . mp , rnd_mode ) ;
return x ;
}
inline const mpreal frac ( const mpreal & v , mp_rnd_t rnd_mode )
{
mpreal x ( v ) ;
mpfr_frac ( x . mp , v . mp , rnd_mode ) ;
return x ;
}
//////////////////////////////////////////////////////////////////////////
// Miscellaneous Functions
inline void swap ( mpreal & a , mpreal & b )
{
mpfr_swap ( a . mp , b . mp ) ;
}
inline const mpreal ( max ) ( const mpreal & x , const mpreal & y )
{
return ( x > y ? x : y ) ;
}
inline const mpreal ( min ) ( const mpreal & x , const mpreal & y )
{
return ( x < y ? x : y ) ;
}
inline const mpreal fmax ( const mpreal & x , const mpreal & y , mp_rnd_t rnd_mode )
{
mpreal a ;
mpfr_max ( a . mp , x . mp , y . mp , rnd_mode ) ;
return a ;
}
inline const mpreal fmin ( const mpreal & x , const mpreal & y , mp_rnd_t rnd_mode )
{
mpreal a ;
mpfr_min ( a . mp , x . mp , y . mp , rnd_mode ) ;
return a ;
}
inline const mpreal nexttoward ( const mpreal & x , const mpreal & y )
{
mpreal a ( x ) ;
mpfr_nexttoward ( a . mp , y . mp ) ;
return a ;
}
inline const mpreal nextabove ( const mpreal & x )
{
mpreal a ( x ) ;
mpfr_nextabove ( a . mp ) ;
return a ;
}
inline const mpreal nextbelow ( const mpreal & x )
{
mpreal a ( x ) ;
mpfr_nextbelow ( a . mp ) ;
return a ;
}
inline const mpreal urandomb ( gmp_randstate_t & state )
{
mpreal x ;
mpfr_urandomb ( x . mp , state ) ;
return x ;
}
# if (MPFR_VERSION >= MPFR_VERSION_NUM(3,0,0))
// use gmp_randinit_default() to init state, gmp_randclear() to clear
2012-06-21 15:56:54 +08:00
inline const mpreal urandom ( gmp_randstate_t & state , mp_rnd_t rnd_mode )
2011-08-19 21:03:45 +08:00
{
mpreal x ;
mpfr_urandom ( x . mp , state , rnd_mode ) ;
return x ;
}
# endif
# if (MPFR_VERSION <= MPFR_VERSION_NUM(2,4,2))
inline const mpreal random2 ( mp_size_t size , mp_exp_t exp )
{
mpreal x ;
mpfr_random2 ( x . mp , size , exp ) ;
return x ;
}
# endif
2012-06-21 15:56:54 +08:00
// Uniformly distributed random number generation
// a = random(seed); <- initialization & first random number generation
// a = random(); <- next random numbers generation
// seed != 0
inline const mpreal random ( unsigned int seed )
{
# if (MPFR_VERSION >= MPFR_VERSION_NUM(3,0,0))
static gmp_randstate_t state ;
static bool isFirstTime = true ;
if ( isFirstTime )
{
gmp_randinit_default ( state ) ;
gmp_randseed_ui ( state , 0 ) ;
isFirstTime = false ;
}
if ( seed ! = 0 ) gmp_randseed_ui ( state , seed ) ;
return mpfr : : urandom ( state ) ;
# else
if ( seed ! = 0 ) std : : srand ( seed ) ;
return mpfr : : mpreal ( std : : rand ( ) / ( double ) RAND_MAX ) ;
# endif
}
2011-08-19 21:03:45 +08:00
//////////////////////////////////////////////////////////////////////////
// Set/Get global properties
inline void mpreal : : set_default_prec ( mp_prec_t prec )
{
default_prec = prec ;
mpfr_set_default_prec ( prec ) ;
}
inline mp_prec_t mpreal : : get_default_prec ( )
{
2012-06-21 15:56:54 +08:00
return ( mpfr_get_default_prec ) ( ) ;
2011-08-19 21:03:45 +08:00
}
inline void mpreal : : set_default_base ( int base )
{
default_base = base ;
}
inline int mpreal : : get_default_base ( )
{
return default_base ;
}
inline void mpreal : : set_default_rnd ( mp_rnd_t rnd_mode )
{
default_rnd = rnd_mode ;
mpfr_set_default_rounding_mode ( rnd_mode ) ;
}
inline mp_rnd_t mpreal : : get_default_rnd ( )
{
2012-06-21 15:56:54 +08:00
return static_cast < mp_rnd_t > ( ( mpfr_get_default_rounding_mode ) ( ) ) ;
2011-08-19 21:03:45 +08:00
}
inline void mpreal : : set_double_bits ( int dbits )
{
double_bits = dbits ;
}
inline int mpreal : : get_double_bits ( )
{
return double_bits ;
}
inline bool mpreal : : fits_in_bits ( double x , int n )
{
int i ;
double t ;
return IsInf ( x ) | | ( std : : modf ( std : : ldexp ( std : : frexp ( x , & i ) , n ) , & t ) = = 0.0 ) ;
}
inline const mpreal pow ( const mpreal & a , const mpreal & b , mp_rnd_t rnd_mode )
{
mpreal x ( a ) ;
mpfr_pow ( x . mp , x . mp , b . mp , rnd_mode ) ;
return x ;
}
inline const mpreal pow ( const mpreal & a , const mpz_t b , mp_rnd_t rnd_mode )
{
mpreal x ( a ) ;
mpfr_pow_z ( x . mp , x . mp , b , rnd_mode ) ;
return x ;
}
inline const mpreal pow ( const mpreal & a , const unsigned long int b , mp_rnd_t rnd_mode )
{
mpreal x ( a ) ;
mpfr_pow_ui ( x . mp , x . mp , b , rnd_mode ) ;
return x ;
}
inline const mpreal pow ( const mpreal & a , const unsigned int b , mp_rnd_t rnd_mode )
{
return pow ( a , static_cast < unsigned long int > ( b ) , rnd_mode ) ;
}
inline const mpreal pow ( const mpreal & a , const long int b , mp_rnd_t rnd_mode )
{
mpreal x ( a ) ;
mpfr_pow_si ( x . mp , x . mp , b , rnd_mode ) ;
return x ;
}
inline const mpreal pow ( const mpreal & a , const int b , mp_rnd_t rnd_mode )
{
return pow ( a , static_cast < long int > ( b ) , rnd_mode ) ;
}
inline const mpreal pow ( const mpreal & a , const long double b , mp_rnd_t rnd_mode )
{
return pow ( a , mpreal ( b ) , rnd_mode ) ;
}
inline const mpreal pow ( const mpreal & a , const double b , mp_rnd_t rnd_mode )
{
return pow ( a , mpreal ( b ) , rnd_mode ) ;
}
inline const mpreal pow ( const unsigned long int a , const mpreal & b , mp_rnd_t rnd_mode )
{
mpreal x ( a ) ;
mpfr_ui_pow ( x . mp , a , b . mp , rnd_mode ) ;
return x ;
}
inline const mpreal pow ( const unsigned int a , const mpreal & b , mp_rnd_t rnd_mode )
{
return pow ( static_cast < unsigned long int > ( a ) , b , rnd_mode ) ;
}
inline const mpreal pow ( const long int a , const mpreal & b , mp_rnd_t rnd_mode )
{
if ( a > = 0 ) return pow ( static_cast < unsigned long int > ( a ) , b , rnd_mode ) ;
else return pow ( mpreal ( a ) , b , rnd_mode ) ;
}
inline const mpreal pow ( const int a , const mpreal & b , mp_rnd_t rnd_mode )
{
if ( a > = 0 ) return pow ( static_cast < unsigned long int > ( a ) , b , rnd_mode ) ;
else return pow ( mpreal ( a ) , b , rnd_mode ) ;
}
inline const mpreal pow ( const long double a , const mpreal & b , mp_rnd_t rnd_mode )
{
return pow ( mpreal ( a ) , b , rnd_mode ) ;
}
inline const mpreal pow ( const double a , const mpreal & b , mp_rnd_t rnd_mode )
{
return pow ( mpreal ( a ) , b , rnd_mode ) ;
}
// pow unsigned long int
inline const mpreal pow ( const unsigned long int a , const unsigned long int b , mp_rnd_t rnd_mode )
{
mpreal x ( a ) ;
mpfr_ui_pow_ui ( x . mp , a , b , rnd_mode ) ;
return x ;
}
inline const mpreal pow ( const unsigned long int a , const unsigned int b , mp_rnd_t rnd_mode )
{
return pow ( a , static_cast < unsigned long int > ( b ) , rnd_mode ) ; //mpfr_ui_pow_ui
}
inline const mpreal pow ( const unsigned long int a , const long int b , mp_rnd_t rnd_mode )
{
if ( b > 0 ) return pow ( a , static_cast < unsigned long int > ( b ) , rnd_mode ) ; //mpfr_ui_pow_ui
else return pow ( a , mpreal ( b ) , rnd_mode ) ; //mpfr_ui_pow
}
inline const mpreal pow ( const unsigned long int a , const int b , mp_rnd_t rnd_mode )
{
if ( b > 0 ) return pow ( a , static_cast < unsigned long int > ( b ) , rnd_mode ) ; //mpfr_ui_pow_ui
else return pow ( a , mpreal ( b ) , rnd_mode ) ; //mpfr_ui_pow
}
inline const mpreal pow ( const unsigned long int a , const long double b , mp_rnd_t rnd_mode )
{
return pow ( a , mpreal ( b ) , rnd_mode ) ; //mpfr_ui_pow
}
inline const mpreal pow ( const unsigned long int a , const double b , mp_rnd_t rnd_mode )
{
return pow ( a , mpreal ( b ) , rnd_mode ) ; //mpfr_ui_pow
}
// pow unsigned int
inline const mpreal pow ( const unsigned int a , const unsigned long int b , mp_rnd_t rnd_mode )
{
return pow ( static_cast < unsigned long int > ( a ) , b , rnd_mode ) ; //mpfr_ui_pow_ui
}
inline const mpreal pow ( const unsigned int a , const unsigned int b , mp_rnd_t rnd_mode )
{
return pow ( static_cast < unsigned long int > ( a ) , static_cast < unsigned long int > ( b ) , rnd_mode ) ; //mpfr_ui_pow_ui
}
inline const mpreal pow ( const unsigned int a , const long int b , mp_rnd_t rnd_mode )
{
if ( b > 0 ) return pow ( static_cast < unsigned long int > ( a ) , static_cast < unsigned long int > ( b ) , rnd_mode ) ; //mpfr_ui_pow_ui
else return pow ( static_cast < unsigned long int > ( a ) , mpreal ( b ) , rnd_mode ) ; //mpfr_ui_pow
}
inline const mpreal pow ( const unsigned int a , const int b , mp_rnd_t rnd_mode )
{
if ( b > 0 ) return pow ( static_cast < unsigned long int > ( a ) , static_cast < unsigned long int > ( b ) , rnd_mode ) ; //mpfr_ui_pow_ui
else return pow ( static_cast < unsigned long int > ( a ) , mpreal ( b ) , rnd_mode ) ; //mpfr_ui_pow
}
inline const mpreal pow ( const unsigned int a , const long double b , mp_rnd_t rnd_mode )
{
return pow ( static_cast < unsigned long int > ( a ) , mpreal ( b ) , rnd_mode ) ; //mpfr_ui_pow
}
inline const mpreal pow ( const unsigned int a , const double b , mp_rnd_t rnd_mode )
{
return pow ( static_cast < unsigned long int > ( a ) , mpreal ( b ) , rnd_mode ) ; //mpfr_ui_pow
}
// pow long int
inline const mpreal pow ( const long int a , const unsigned long int b , mp_rnd_t rnd_mode )
{
if ( a > 0 ) return pow ( static_cast < unsigned long int > ( a ) , b , rnd_mode ) ; //mpfr_ui_pow_ui
else return pow ( mpreal ( a ) , b , rnd_mode ) ; //mpfr_pow_ui
}
inline const mpreal pow ( const long int a , const unsigned int b , mp_rnd_t rnd_mode )
{
if ( a > 0 ) return pow ( static_cast < unsigned long int > ( a ) , static_cast < unsigned long int > ( b ) , rnd_mode ) ; //mpfr_ui_pow_ui
else return pow ( mpreal ( a ) , static_cast < unsigned long int > ( b ) , rnd_mode ) ; //mpfr_pow_ui
}
inline const mpreal pow ( const long int a , const long int b , mp_rnd_t rnd_mode )
{
if ( a > 0 )
{
if ( b > 0 ) return pow ( static_cast < unsigned long int > ( a ) , static_cast < unsigned long int > ( b ) , rnd_mode ) ; //mpfr_ui_pow_ui
else return pow ( static_cast < unsigned long int > ( a ) , mpreal ( b ) , rnd_mode ) ; //mpfr_ui_pow
} else {
return pow ( mpreal ( a ) , b , rnd_mode ) ; // mpfr_pow_si
}
}
inline const mpreal pow ( const long int a , const int b , mp_rnd_t rnd_mode )
{
if ( a > 0 )
{
if ( b > 0 ) return pow ( static_cast < unsigned long int > ( a ) , static_cast < unsigned long int > ( b ) , rnd_mode ) ; //mpfr_ui_pow_ui
else return pow ( static_cast < unsigned long int > ( a ) , mpreal ( b ) , rnd_mode ) ; //mpfr_ui_pow
} else {
return pow ( mpreal ( a ) , static_cast < long int > ( b ) , rnd_mode ) ; // mpfr_pow_si
}
}
inline const mpreal pow ( const long int a , const long double b , mp_rnd_t rnd_mode )
{
if ( a > = 0 ) return pow ( static_cast < unsigned long int > ( a ) , mpreal ( b ) , rnd_mode ) ; //mpfr_ui_pow
else return pow ( mpreal ( a ) , mpreal ( b ) , rnd_mode ) ; //mpfr_pow
}
inline const mpreal pow ( const long int a , const double b , mp_rnd_t rnd_mode )
{
if ( a > = 0 ) return pow ( static_cast < unsigned long int > ( a ) , mpreal ( b ) , rnd_mode ) ; //mpfr_ui_pow
else return pow ( mpreal ( a ) , mpreal ( b ) , rnd_mode ) ; //mpfr_pow
}
// pow int
inline const mpreal pow ( const int a , const unsigned long int b , mp_rnd_t rnd_mode )
{
if ( a > 0 ) return pow ( static_cast < unsigned long int > ( a ) , b , rnd_mode ) ; //mpfr_ui_pow_ui
else return pow ( mpreal ( a ) , b , rnd_mode ) ; //mpfr_pow_ui
}
inline const mpreal pow ( const int a , const unsigned int b , mp_rnd_t rnd_mode )
{
if ( a > 0 ) return pow ( static_cast < unsigned long int > ( a ) , static_cast < unsigned long int > ( b ) , rnd_mode ) ; //mpfr_ui_pow_ui
else return pow ( mpreal ( a ) , static_cast < unsigned long int > ( b ) , rnd_mode ) ; //mpfr_pow_ui
}
inline const mpreal pow ( const int a , const long int b , mp_rnd_t rnd_mode )
{
if ( a > 0 )
{
if ( b > 0 ) return pow ( static_cast < unsigned long int > ( a ) , static_cast < unsigned long int > ( b ) , rnd_mode ) ; //mpfr_ui_pow_ui
else return pow ( static_cast < unsigned long int > ( a ) , mpreal ( b ) , rnd_mode ) ; //mpfr_ui_pow
} else {
return pow ( mpreal ( a ) , b , rnd_mode ) ; // mpfr_pow_si
}
}
inline const mpreal pow ( const int a , const int b , mp_rnd_t rnd_mode )
{
if ( a > 0 )
{
if ( b > 0 ) return pow ( static_cast < unsigned long int > ( a ) , static_cast < unsigned long int > ( b ) , rnd_mode ) ; //mpfr_ui_pow_ui
else return pow ( static_cast < unsigned long int > ( a ) , mpreal ( b ) , rnd_mode ) ; //mpfr_ui_pow
} else {
return pow ( mpreal ( a ) , static_cast < long int > ( b ) , rnd_mode ) ; // mpfr_pow_si
}
}
inline const mpreal pow ( const int a , const long double b , mp_rnd_t rnd_mode )
{
if ( a > = 0 ) return pow ( static_cast < unsigned long int > ( a ) , mpreal ( b ) , rnd_mode ) ; //mpfr_ui_pow
else return pow ( mpreal ( a ) , mpreal ( b ) , rnd_mode ) ; //mpfr_pow
}
inline const mpreal pow ( const int a , const double b , mp_rnd_t rnd_mode )
{
if ( a > = 0 ) return pow ( static_cast < unsigned long int > ( a ) , mpreal ( b ) , rnd_mode ) ; //mpfr_ui_pow
else return pow ( mpreal ( a ) , mpreal ( b ) , rnd_mode ) ; //mpfr_pow
}
// pow long double
inline const mpreal pow ( const long double a , const long double b , mp_rnd_t rnd_mode )
{
return pow ( mpreal ( a ) , mpreal ( b ) , rnd_mode ) ;
}
inline const mpreal pow ( const long double a , const unsigned long int b , mp_rnd_t rnd_mode )
{
return pow ( mpreal ( a ) , b , rnd_mode ) ; //mpfr_pow_ui
}
inline const mpreal pow ( const long double a , const unsigned int b , mp_rnd_t rnd_mode )
{
return pow ( mpreal ( a ) , static_cast < unsigned long int > ( b ) , rnd_mode ) ; //mpfr_pow_ui
}
inline const mpreal pow ( const long double a , const long int b , mp_rnd_t rnd_mode )
{
return pow ( mpreal ( a ) , b , rnd_mode ) ; // mpfr_pow_si
}
inline const mpreal pow ( const long double a , const int b , mp_rnd_t rnd_mode )
{
return pow ( mpreal ( a ) , static_cast < long int > ( b ) , rnd_mode ) ; // mpfr_pow_si
}
inline const mpreal pow ( const double a , const double b , mp_rnd_t rnd_mode )
{
return pow ( mpreal ( a ) , mpreal ( b ) , rnd_mode ) ;
}
inline const mpreal pow ( const double a , const unsigned long int b , mp_rnd_t rnd_mode )
{
return pow ( mpreal ( a ) , b , rnd_mode ) ; // mpfr_pow_ui
}
inline const mpreal pow ( const double a , const unsigned int b , mp_rnd_t rnd_mode )
{
return pow ( mpreal ( a ) , static_cast < unsigned long int > ( b ) , rnd_mode ) ; // mpfr_pow_ui
}
inline const mpreal pow ( const double a , const long int b , mp_rnd_t rnd_mode )
{
return pow ( mpreal ( a ) , b , rnd_mode ) ; // mpfr_pow_si
}
inline const mpreal pow ( const double a , const int b , mp_rnd_t rnd_mode )
{
return pow ( mpreal ( a ) , static_cast < long int > ( b ) , rnd_mode ) ; // mpfr_pow_si
}
2012-06-21 15:56:54 +08:00
} // End of mpfr namespace
2011-08-19 21:03:45 +08:00
// Explicit specialization of std::swap for mpreal numbers
// Thus standard algorithms will use efficient version of swap (due to Koenig lookup)
// Non-throwing swap C++ idiom: http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Non-throwing_swap
namespace std
{
template < >
inline void swap ( mpfr : : mpreal & x , mpfr : : mpreal & y )
{
return mpfr : : swap ( x , y ) ;
}
}
2012-06-21 15:56:54 +08:00
# endif /* __MPREAL_H__ */