From 5a962c6d24f8380ccd28127b3a91de6aebd30e20 Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Wed, 18 Jan 2023 11:25:41 +0100 Subject: [PATCH 1/7] update CI image --- .github/workflows/validation.yml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/validation.yml b/.github/workflows/validation.yml index c0d77d91c..a57fd0807 100644 --- a/.github/workflows/validation.yml +++ b/.github/workflows/validation.yml @@ -33,7 +33,7 @@ jobs: name: Build and run tests runs-on: ubuntu-latest container: - image: ghcr.io/lobis/root-geant4-garfield:rest-for-physics + image: ghcr.io/rest-for-physics/base:latest steps: - uses: actions/checkout@v3 - name: Build and install @@ -52,7 +52,7 @@ jobs: name: Build and cache installation runs-on: ubuntu-latest container: - image: ghcr.io/lobis/root-geant4-garfield:rest-for-physics + image: ghcr.io/rest-for-physics/base:latest steps: - uses: actions/checkout@v3 - name: Build and install @@ -84,7 +84,7 @@ jobs: name: "Previous Version File Compatibility" runs-on: ubuntu-latest container: - image: ghcr.io/lobis/root-geant4-garfield:rest-for-physics + image: ghcr.io/rest-for-physics/base:latest needs: [ framework-install ] steps: - uses: actions/checkout@v3 @@ -107,7 +107,7 @@ jobs: name: "Macros with clean error output" runs-on: ubuntu-latest container: - image: ghcr.io/lobis/root-geant4-garfield:rest-for-physics + image: ghcr.io/rest-for-physics/base:latest needs: [ framework-install ] steps: - uses: actions/checkout@v3 @@ -135,7 +135,7 @@ jobs: name: "PyROOT" runs-on: ubuntu-latest container: - image: ghcr.io/lobis/root-geant4-garfield:rest-for-physics + image: ghcr.io/rest-for-physics/base:latest needs: [ framework-install ] steps: - name: Restore cache @@ -153,7 +153,7 @@ jobs: name: "Metadata" runs-on: ubuntu-latest container: - image: ghcr.io/lobis/root-geant4-garfield:rest-for-physics + image: ghcr.io/rest-for-physics/base:latest needs: [ framework-install ] steps: - uses: actions/checkout@v3 @@ -205,7 +205,7 @@ jobs: name: "PandaX-III" runs-on: ubuntu-latest container: - image: ghcr.io/lobis/root-geant4-garfield:rest-for-physics + image: ghcr.io/rest-for-physics/base:latest needs: [ framework-install ] steps: - uses: actions/checkout@v3 @@ -293,7 +293,7 @@ jobs: name: "TREX-DM" runs-on: ubuntu-latest container: - image: ghcr.io/lobis/root-geant4-garfield:rest-for-physics + image: ghcr.io/rest-for-physics/base:latest needs: [ framework-install ] steps: - uses: actions/checkout@v3 @@ -346,7 +346,7 @@ jobs: name: Run examples runs-on: ubuntu-latest container: - image: ghcr.io/lobis/root-geant4-garfield:rest-for-physics + image: ghcr.io/rest-for-physics/base:latest needs: [ framework-install ] steps: - uses: actions/checkout@v3 From 56e2368d65b2649e291df6ff34ddbf761984975a Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Tue, 14 Feb 2023 09:41:19 +0100 Subject: [PATCH 2/7] update ci image name --- .github/workflows/validation.yml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/validation.yml b/.github/workflows/validation.yml index ac2df4953..1c50b22f6 100644 --- a/.github/workflows/validation.yml +++ b/.github/workflows/validation.yml @@ -32,7 +32,7 @@ jobs: name: Build and run tests runs-on: ubuntu-latest container: - image: ghcr.io/rest-for-physics/base:latest + image: ghcr.io/rest-for-physics/root-garfield-geant4:latest steps: - uses: actions/checkout@v3 - name: Build and install @@ -51,7 +51,7 @@ jobs: name: Build and cache installation runs-on: ubuntu-latest container: - image: ghcr.io/rest-for-physics/base:latest + image: ghcr.io/rest-for-physics/root-garfield-geant4:latest steps: - uses: actions/checkout@v3 - name: Build and install @@ -83,7 +83,7 @@ jobs: name: "Previous Version File Compatibility" runs-on: ubuntu-latest container: - image: ghcr.io/rest-for-physics/base:latest + image: ghcr.io/rest-for-physics/root-garfield-geant4:latest needs: [ framework-install ] steps: - uses: actions/checkout@v3 @@ -106,7 +106,7 @@ jobs: name: "Macros with clean error output" runs-on: ubuntu-latest container: - image: ghcr.io/rest-for-physics/base:latest + image: ghcr.io/rest-for-physics/root-garfield-geant4:latest needs: [ framework-install ] steps: - uses: actions/checkout@v3 @@ -134,7 +134,7 @@ jobs: name: "PyROOT" runs-on: ubuntu-latest container: - image: ghcr.io/rest-for-physics/base:latest + image: ghcr.io/rest-for-physics/root-garfield-geant4:latest needs: [ framework-install ] steps: - name: Restore cache @@ -152,7 +152,7 @@ jobs: name: "Metadata" runs-on: ubuntu-latest container: - image: ghcr.io/rest-for-physics/base:latest + image: ghcr.io/rest-for-physics/root-garfield-geant4:latest needs: [ framework-install ] steps: - uses: actions/checkout@v3 @@ -204,7 +204,7 @@ jobs: name: "PandaX-III" runs-on: ubuntu-latest container: - image: ghcr.io/rest-for-physics/base:latest + image: ghcr.io/rest-for-physics/root-garfield-geant4:latest needs: [ framework-install ] steps: - uses: actions/checkout@v3 @@ -292,7 +292,7 @@ jobs: name: "TREX-DM" runs-on: ubuntu-latest container: - image: ghcr.io/rest-for-physics/base:latest + image: ghcr.io/rest-for-physics/root-garfield-geant4:latest needs: [ framework-install ] steps: - uses: actions/checkout@v3 @@ -345,7 +345,7 @@ jobs: name: Run examples runs-on: ubuntu-latest container: - image: ghcr.io/rest-for-physics/base:latest + image: ghcr.io/rest-for-physics/root-garfield-geant4:latest needs: [ framework-install ] steps: - uses: actions/checkout@v3 From bc7328dd62cfc7bdf31a99692b30be3ed0155799 Mon Sep 17 00:00:00 2001 From: Raul Ena Date: Wed, 3 May 2023 13:54:46 +0200 Subject: [PATCH 3/7] mpreal.h has been removed --- source/framework/tools/inc/mpreal.h | 3106 --------------------------- 1 file changed, 3106 deletions(-) delete mode 100644 source/framework/tools/inc/mpreal.h diff --git a/source/framework/tools/inc/mpreal.h b/source/framework/tools/inc/mpreal.h deleted file mode 100644 index 6d8820dce..000000000 --- a/source/framework/tools/inc/mpreal.h +++ /dev/null @@ -1,3106 +0,0 @@ -/* - MPFR C++: Multi-precision floating point number class for C++. - Based on MPFR library: http://mpfr.org - - Project homepage: http://www.holoborodko.com/pavel/mpfr - Contact e-mail: pavel@holoborodko.com - - Copyright (c) 2008-2015 Pavel Holoborodko - - Contributors: - Dmitriy Gubanov, Konstantin Holoborodko, Brian Gladman, - Helmut Jarausch, Fokko Beekhof, Ulrich Mutze, Heinz van Saanen, - Pere Constans, Peter van Hoof, Gael Guennebaud, Tsai Chia Cheng, - Alexei Zubanov, Jauhien Piatlicki, Victor Berger, John Westwood, - Petr Aleksandrov, Orion Poplawski, Charles Karney, Arash Partow, - Rodney James, Jorge Leitao. - - Licensing: - (A) MPFR C++ is under GNU General Public License ("GPL"). - - (B) Non-free licenses may also be purchased from the author, for users who - do not want their programs protected by the GPL. - - The non-free licenses are for users that wish to use MPFR C++ in - their products but are unwilling to release their software - under the GPL (which would require them to release source code - and allow free redistribution). - - Such users can purchase an unlimited-use license from the author. - Contact us for more details. - - GNU General Public License ("GPL") copyright permissions statement: - ************************************************************************** - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program 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 General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef __MPREAL_H__ -#define __MPREAL_H__ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// Options -#define MPREAL_HAVE_MSVC_DEBUGVIEW // Enable Debugger Visualizer for "Debug" builds in MSVC. -#define MPREAL_HAVE_DYNAMIC_STD_NUMERIC_LIMITS // Enable extended std::numeric_limits - // specialization. -// Meaning that "digits", "round_style" and similar members are defined as functions, not constants. -// See std::numeric_limits at the end of the file for more information. - -// Library version -#define MPREAL_VERSION_MAJOR 3 -#define MPREAL_VERSION_MINOR 6 -#define MPREAL_VERSION_PATCHLEVEL 2 -#define MPREAL_VERSION_STRING "3.6.2" - -// 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 - -#elif defined(_MSC_VER) // Microsoft Visual C++ -#define IsInf(x) (!_finite(x)) - -#else -#define IsInf(x) std::isinf(x) // GNU C/C++ (and/or other compilers), just hope for C99 conformance -#endif - -// A Clang feature extension to determine compiler features. -#ifndef __has_feature -#define __has_feature(x) 0 -#endif - -// Detect support for r-value references (move semantic). Borrowed from Eigen. -#if (__has_feature(cxx_rvalue_references) || defined(__GXX_EXPERIMENTAL_CXX0X__) || \ - __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1600)) - -#define MPREAL_HAVE_MOVE_SUPPORT - -// Use fields in mpfr_t structure to check if it was initialized / set dummy initialization -#define mpfr_is_initialized(x) (0 != (x)->_mpfr_d) -#define mpfr_set_uninitialized(x) ((x)->_mpfr_d = 0) -#endif - -// Detect support for explicit converters. -#if (__has_feature(cxx_explicit_conversions) || \ - (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GNUC_MINOR >= 5) || __cplusplus >= 201103L || \ - (defined(_MSC_VER) && _MSC_VER >= 1800)) - -#define MPREAL_HAVE_EXPLICIT_CONVERTERS -#endif - -#define MPFR_USE_INTMAX_T // Enable 64-bit integer types - should be defined before mpfr.h - -#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 - -#if (MPFR_VERSION < MPFR_VERSION_NUM(3, 0, 0)) -#include // Needed for random() -#endif - -// Less important options -#define MPREAL_DOUBLE_BITS_OVERFLOW \ - -1 // Triggers overflow exception during conversion to double if mpreal - // cannot fit in MPREAL_DOUBLE_BITS_OVERFLOW bits - // = -1 disables overflow checks (default) - -// Fast replacement for mpfr_set_zero(x, +1): -// (a) uses low-level data members, might not be compatible with new versions of MPFR -// (b) sign is not set, add (x)->_mpfr_sign = 1; -#define mpfr_set_zero_fast(x) ((x)->_mpfr_exp = __MPFR_EXP_ZERO) - -#if defined(__GNUC__) -#define MPREAL_PERMISSIVE_EXPR __extension__ -#else -#define MPREAL_PERMISSIVE_EXPR -#endif - -namespace mpfr { - -class mpreal { - private: - mpfr_t mp; - - public: - // Get default rounding mode & precision - inline static mp_rnd_t get_default_rnd() { return (mp_rnd_t)(mpfr_get_default_rounding_mode()); } - inline static mp_prec_t get_default_prec() { return mpfr_get_default_prec(); } - - // Constructors && type conversions - mpreal(); - mpreal(const mpreal& u); - mpreal(const mpf_t u); - mpreal(const mpz_t u, mp_prec_t prec = mpreal::get_default_prec(), - mp_rnd_t mode = mpreal::get_default_rnd()); - mpreal(const mpq_t u, mp_prec_t prec = mpreal::get_default_prec(), - mp_rnd_t mode = mpreal::get_default_rnd()); - mpreal(const double u, mp_prec_t prec = mpreal::get_default_prec(), - mp_rnd_t mode = mpreal::get_default_rnd()); - mpreal(const long double u, mp_prec_t prec = mpreal::get_default_prec(), - mp_rnd_t mode = mpreal::get_default_rnd()); - mpreal(const unsigned long long int u, mp_prec_t prec = mpreal::get_default_prec(), - mp_rnd_t mode = mpreal::get_default_rnd()); - mpreal(const long long int u, mp_prec_t prec = mpreal::get_default_prec(), - mp_rnd_t mode = mpreal::get_default_rnd()); - mpreal(const unsigned long int u, mp_prec_t prec = mpreal::get_default_prec(), - mp_rnd_t mode = mpreal::get_default_rnd()); - mpreal(const unsigned int u, mp_prec_t prec = mpreal::get_default_prec(), - mp_rnd_t mode = mpreal::get_default_rnd()); - mpreal(const long int u, mp_prec_t prec = mpreal::get_default_prec(), - mp_rnd_t mode = mpreal::get_default_rnd()); - mpreal(const int u, mp_prec_t prec = mpreal::get_default_prec(), - mp_rnd_t mode = mpreal::get_default_rnd()); - - // Construct mpreal from mpfr_t structure. - // shared = true allows to avoid deep copy, so that mpreal and 'u' share the same data & pointers. - mpreal(const mpfr_t u, bool shared = false); - - mpreal(const char* s, mp_prec_t prec = mpreal::get_default_prec(), int base = 10, - mp_rnd_t mode = mpreal::get_default_rnd()); - mpreal(const std::string& s, mp_prec_t prec = mpreal::get_default_prec(), int base = 10, - mp_rnd_t mode = mpreal::get_default_rnd()); - - ~mpreal(); - -#ifdef MPREAL_HAVE_MOVE_SUPPORT - mpreal& operator=(mpreal&& v); - mpreal(mpreal&& u); -#endif - - // 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 long long int v); - mpreal& operator=(const long 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 std::string& s); - template - mpreal& operator=(const std::complex& z); - - // + - 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); - - mpreal& operator+=(const long long int u); - mpreal& operator+=(const unsigned long long int u); - mpreal& operator-=(const long long int u); - mpreal& operator-=(const unsigned long long int u); - mpreal& operator*=(const long long int u); - mpreal& operator*=(const unsigned long long int u); - mpreal& operator/=(const long long int u); - mpreal& operator/=(const unsigned long long int u); - - 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); - - // Type Conversion operators - bool toBool() const; - long toLong(mp_rnd_t mode = GMP_RNDZ) const; - unsigned long toULong(mp_rnd_t mode = GMP_RNDZ) const; - long long toLLong(mp_rnd_t mode = GMP_RNDZ) const; - unsigned long long toULLong(mp_rnd_t mode = GMP_RNDZ) const; - float toFloat(mp_rnd_t mode = GMP_RNDN) const; - double toDouble(mp_rnd_t mode = GMP_RNDN) const; - long double toLDouble(mp_rnd_t mode = GMP_RNDN) const; - -#if defined(MPREAL_HAVE_EXPLICIT_CONVERTERS) - explicit operator bool() const { return toBool(); } - explicit operator int() const { return int(toLong()); } - explicit operator long() const { return toLong(); } - explicit operator long long() const { return toLLong(); } - explicit operator unsigned() const { return unsigned(toULong()); } - explicit operator unsigned long() const { return toULong(); } - explicit operator unsigned long long() const { return toULLong(); } - explicit operator float() const { return toFloat(); } - explicit operator double() const { return toDouble(); } - explicit operator long double() const { return toLDouble(); } -#endif - - // Get raw pointers so that mpreal can be directly used in raw mpfr_* functions - ::mpfr_ptr mpfr_ptr(); - ::mpfr_srcptr mpfr_ptr() const; - ::mpfr_srcptr mpfr_srcptr() const; - - // Convert mpreal to string with n significant digits in base b - // n = -1 -> convert with the maximum available digits - std::string toString(int n = -1, int b = 10, mp_rnd_t mode = mpreal::get_default_rnd()) const; - -#if (MPFR_VERSION >= MPFR_VERSION_NUM(2, 4, 0)) - std::string toString(const std::string& format) const; -#endif - - std::ostream& output(std::ostream& os) const; - - // Math Functions - friend const mpreal sqr(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal sqrt(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal sqrt(const unsigned long int v, mp_rnd_t rnd_mode); - friend const mpreal cbrt(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal root(const mpreal& v, unsigned long int k, mp_rnd_t rnd_mode); - friend const mpreal pow(const mpreal& a, const mpreal& b, mp_rnd_t rnd_mode); - friend const mpreal pow(const mpreal& a, const mpz_t b, mp_rnd_t rnd_mode); - friend const mpreal pow(const mpreal& a, const unsigned long int b, mp_rnd_t rnd_mode); - friend const mpreal pow(const mpreal& a, const long int b, mp_rnd_t rnd_mode); - friend const mpreal pow(const unsigned long int a, const mpreal& b, mp_rnd_t rnd_mode); - friend const mpreal pow(const unsigned long int a, const unsigned long int b, mp_rnd_t rnd_mode); - friend const mpreal fabs(const mpreal& v, mp_rnd_t rnd_mode); - - friend const mpreal abs(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal dim(const mpreal& a, const mpreal& b, mp_rnd_t rnd_mode); - friend inline const mpreal mul_2ui(const mpreal& v, unsigned long int k, mp_rnd_t rnd_mode); - friend inline const mpreal mul_2si(const mpreal& v, long int k, mp_rnd_t rnd_mode); - friend inline const mpreal div_2ui(const mpreal& v, unsigned long int k, mp_rnd_t rnd_mode); - friend inline const mpreal div_2si(const mpreal& v, long int k, mp_rnd_t rnd_mode); - friend int cmpabs(const mpreal& a, const mpreal& b); - - friend const mpreal log(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal log2(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal logb(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal log10(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal exp(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal exp2(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal exp10(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal log1p(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal expm1(const mpreal& v, mp_rnd_t rnd_mode); - - friend const mpreal cos(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal sin(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal tan(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal sec(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal csc(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal cot(const mpreal& v, mp_rnd_t rnd_mode); - friend int sin_cos(mpreal& s, mpreal& c, const mpreal& v, mp_rnd_t rnd_mode); - - friend const mpreal acos(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal asin(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal atan(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal atan2(const mpreal& y, const mpreal& x, mp_rnd_t rnd_mode); - friend const mpreal acot(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal asec(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal acsc(const mpreal& v, mp_rnd_t rnd_mode); - - friend const mpreal cosh(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal sinh(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal tanh(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal sech(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal csch(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal coth(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal acosh(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal asinh(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal atanh(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal acoth(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal asech(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal acsch(const mpreal& v, mp_rnd_t rnd_mode); - - friend const mpreal hypot(const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode); - - friend const mpreal fac_ui(unsigned long int v, mp_prec_t prec, mp_rnd_t rnd_mode); - friend const mpreal eint(const mpreal& v, mp_rnd_t rnd_mode); - - friend const mpreal gamma(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal tgamma(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal lngamma(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal lgamma(const mpreal& v, int* signp, mp_rnd_t rnd_mode); - friend const mpreal zeta(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal erf(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal erfc(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal besselj0(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal besselj1(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal besseljn(long n, const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal bessely0(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal bessely1(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal besselyn(long n, const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal fma(const mpreal& v1, const mpreal& v2, const mpreal& v3, mp_rnd_t rnd_mode); - friend const mpreal fms(const mpreal& v1, const mpreal& v2, const mpreal& v3, mp_rnd_t rnd_mode); - friend const mpreal agm(const mpreal& v1, const mpreal& v2, mp_rnd_t rnd_mode); - friend const mpreal sum(const mpreal tab[], const unsigned long int n, int& status, mp_rnd_t rnd_mode); - friend int sgn(const mpreal& v); // returns -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); - friend const mpreal li2(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal fmod(const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode); - friend const mpreal rec_sqrt(const mpreal& v, mp_rnd_t rnd_mode); - - // MATLAB's semantic equivalents - friend const mpreal rem(const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode); // Remainder after division - friend const mpreal mod(const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode); // Modulus after division -#endif - -#if (MPFR_VERSION >= MPFR_VERSION_NUM(3, 0, 0)) - friend const mpreal digamma(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal ai(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal urandom( - gmp_randstate_t& state, - mp_rnd_t rnd_mode); // use gmp_randinit_default() to init state, gmp_randclear() to clear -#endif - -#if (MPFR_VERSION >= MPFR_VERSION_NUM(3, 1, 0)) - friend const mpreal grandom( - gmp_randstate_t& state, - mp_rnd_t rnd_mode); // use gmp_randinit_default() to init state, gmp_randclear() to clear - friend const mpreal grandom(unsigned int seed); -#endif - - // 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); - - // 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); - friend const mpreal scalbn(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, mp_rnd_t rnd_mode); - friend const mpreal const_pi(mp_prec_t prec, mp_rnd_t rnd_mode); - friend const mpreal const_euler(mp_prec_t prec, mp_rnd_t rnd_mode); - friend const mpreal const_catalan(mp_prec_t prec, mp_rnd_t rnd_mode); - - // returns +inf iff sign>=0 otherwise -inf - friend const mpreal const_infinity(int sign, mp_prec_t prec); - - // 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); - 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); - friend const mpreal rint_floor(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal rint_round(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal rint_trunc(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal frac(const mpreal& v, mp_rnd_t rnd_mode); - friend const mpreal remainder(const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode); - friend const mpreal remquo(long* q, const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode); - - // 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 - 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); - -#if (MPFR_VERSION >= MPFR_VERSION_NUM(3, 0, 0)) - friend bool isregular(const mpreal& v); -#endif - - // Set/Get instance properties - inline mp_prec_t get_prec() const; - inline void set_prec(mp_prec_t prec, - mp_rnd_t rnd_mode = get_default_rnd()); // Change precision with rounding mode - - // Aliases for get_prec(), set_prec() - needed for compatibility with std::complex interface - inline mpreal& setPrecision(int Precision, mp_rnd_t RoundingMode = get_default_rnd()); - 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 = get_default_rnd()); - - // Exponent - mp_exp_t get_exp(); - int set_exp(mp_exp_t e); - int check_range(int t, mp_rnd_t rnd_mode = get_default_rnd()); - int subnormalize(int t, mp_rnd_t rnd_mode = get_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 void set_default_rnd(mp_rnd_t rnd_mode); - - 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); - - // Efficient swapping of two mpreal values - needed for std algorithms - friend void swap(mpreal& x, mpreal& y); - - friend const mpreal fmax(const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode); - friend const mpreal fmin(const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode); - - private: - // Human friendly Debug Preview in Visual Studio. - // Put one of these lines: - // - // mpfr::mpreal= ; Show value only - // mpfr::mpreal=, bits ; Show value & precision - // - // at the beginning of - // [Visual Studio Installation Folder]\Common7\Packages\Debugger\autoexp.dat - MPREAL_MSVC_DEBUGVIEW_DATA - - // "Smart" resources deallocation. Checks if instance initialized before deletion. - void clear(::mpfr_ptr); -}; - -////////////////////////////////////////////////////////////////////////// -// Exceptions -class conversion_overflow : public std::exception { - public: - std::string why() { return "inexact conversion from floating point"; } -}; - -////////////////////////////////////////////////////////////////////////// -// Constructors & converters -// Default constructor: creates mp number and initializes it to 0. -inline mpreal::mpreal() { - mpfr_init2(mpfr_ptr(), mpreal::get_default_prec()); - mpfr_set_zero_fast(mpfr_ptr()); - - MPREAL_MSVC_DEBUGVIEW_CODE; -} - -inline mpreal::mpreal(const mpreal& u) { - mpfr_init2(mpfr_ptr(), mpfr_get_prec(u.mpfr_srcptr())); - mpfr_set(mpfr_ptr(), u.mpfr_srcptr(), mpreal::get_default_rnd()); - - MPREAL_MSVC_DEBUGVIEW_CODE; -} - -#ifdef MPREAL_HAVE_MOVE_SUPPORT -inline mpreal::mpreal(mpreal&& other) { - mpfr_set_uninitialized(mpfr_ptr()); // make sure "other" holds no pointer to actual data - mpfr_swap(mpfr_ptr(), other.mpfr_ptr()); - - MPREAL_MSVC_DEBUGVIEW_CODE; -} - -inline mpreal& mpreal::operator=(mpreal&& other) { - mpfr_swap(mpfr_ptr(), other.mpfr_ptr()); - - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} -#endif - -inline mpreal::mpreal(const mpfr_t u, bool shared) { - if (shared) { - std::memcpy(mpfr_ptr(), u, sizeof(mpfr_t)); - } else { - mpfr_init2(mpfr_ptr(), mpfr_get_prec(u)); - mpfr_set(mpfr_ptr(), u, mpreal::get_default_rnd()); - } - - MPREAL_MSVC_DEBUGVIEW_CODE; -} - -inline mpreal::mpreal(const mpf_t u) { - mpfr_init2(mpfr_ptr(), - (mp_prec_t)mpf_get_prec(u)); // (gmp: mp_bitcnt_t) unsigned long -> long (mpfr: mp_prec_t) - mpfr_set_f(mpfr_ptr(), u, mpreal::get_default_rnd()); - - MPREAL_MSVC_DEBUGVIEW_CODE; -} - -inline mpreal::mpreal(const mpz_t u, mp_prec_t prec, mp_rnd_t mode) { - mpfr_init2(mpfr_ptr(), prec); - mpfr_set_z(mpfr_ptr(), u, mode); - - MPREAL_MSVC_DEBUGVIEW_CODE; -} - -inline mpreal::mpreal(const mpq_t u, mp_prec_t prec, mp_rnd_t mode) { - mpfr_init2(mpfr_ptr(), prec); - mpfr_set_q(mpfr_ptr(), u, mode); - - MPREAL_MSVC_DEBUGVIEW_CODE; -} - -inline mpreal::mpreal(const double u, mp_prec_t prec, mp_rnd_t mode) { - mpfr_init2(mpfr_ptr(), prec); - -#if (MPREAL_DOUBLE_BITS_OVERFLOW > -1) - if (fits_in_bits(u, MPREAL_DOUBLE_BITS_OVERFLOW)) { - mpfr_set_d(mpfr_ptr(), u, mode); - } else - throw conversion_overflow(); -#else - mpfr_set_d(mpfr_ptr(), u, mode); -#endif - - MPREAL_MSVC_DEBUGVIEW_CODE; -} - -inline mpreal::mpreal(const long double u, mp_prec_t prec, mp_rnd_t mode) { - mpfr_init2(mpfr_ptr(), prec); - mpfr_set_ld(mpfr_ptr(), u, mode); - - MPREAL_MSVC_DEBUGVIEW_CODE; -} - -inline mpreal::mpreal(const unsigned long long int u, mp_prec_t prec, mp_rnd_t mode) { - mpfr_init2(mpfr_ptr(), prec); - mpfr_set_uj(mpfr_ptr(), u, mode); - - MPREAL_MSVC_DEBUGVIEW_CODE; -} - -inline mpreal::mpreal(const long long int u, mp_prec_t prec, mp_rnd_t mode) { - mpfr_init2(mpfr_ptr(), prec); - mpfr_set_sj(mpfr_ptr(), u, mode); - - MPREAL_MSVC_DEBUGVIEW_CODE; -} - -inline mpreal::mpreal(const unsigned long int u, mp_prec_t prec, mp_rnd_t mode) { - mpfr_init2(mpfr_ptr(), prec); - mpfr_set_ui(mpfr_ptr(), u, mode); - - MPREAL_MSVC_DEBUGVIEW_CODE; -} - -inline mpreal::mpreal(const unsigned int u, mp_prec_t prec, mp_rnd_t mode) { - mpfr_init2(mpfr_ptr(), prec); - mpfr_set_ui(mpfr_ptr(), u, mode); - - MPREAL_MSVC_DEBUGVIEW_CODE; -} - -inline mpreal::mpreal(const long int u, mp_prec_t prec, mp_rnd_t mode) { - mpfr_init2(mpfr_ptr(), prec); - mpfr_set_si(mpfr_ptr(), u, mode); - - MPREAL_MSVC_DEBUGVIEW_CODE; -} - -inline mpreal::mpreal(const int u, mp_prec_t prec, mp_rnd_t mode) { - mpfr_init2(mpfr_ptr(), prec); - mpfr_set_si(mpfr_ptr(), u, mode); - - MPREAL_MSVC_DEBUGVIEW_CODE; -} - -inline mpreal::mpreal(const char* s, mp_prec_t prec, int base, mp_rnd_t mode) { - mpfr_init2(mpfr_ptr(), prec); - mpfr_set_str(mpfr_ptr(), s, base, mode); - - MPREAL_MSVC_DEBUGVIEW_CODE; -} - -inline mpreal::mpreal(const std::string& s, mp_prec_t prec, int base, mp_rnd_t mode) { - mpfr_init2(mpfr_ptr(), prec); - mpfr_set_str(mpfr_ptr(), s.c_str(), base, mode); - - MPREAL_MSVC_DEBUGVIEW_CODE; -} - -inline void mpreal::clear(::mpfr_ptr x) { -#ifdef MPREAL_HAVE_MOVE_SUPPORT - if (mpfr_is_initialized(x)) -#endif - mpfr_clear(x); -} - -inline mpreal::~mpreal() { clear(mpfr_ptr()); } - -// internal namespace needed for template magic -namespace internal { - -// Use SFINAE to restrict arithmetic operations instantiation only for numeric types -// This is needed for smooth integration with libraries based on expression templates, like Eigen. -// TODO: Do the same for boolean operators. -template -struct result_type {}; - -template <> -struct result_type { - typedef mpreal type; -}; -template <> -struct result_type { - typedef mpreal type; -}; -template <> -struct result_type { - typedef mpreal type; -}; -template <> -struct result_type { - typedef mpreal type; -}; -template <> -struct result_type { - typedef mpreal type; -}; -template <> -struct result_type { - typedef mpreal type; -}; -template <> -struct result_type { - typedef mpreal type; -}; -template <> -struct result_type { - typedef mpreal type; -}; -template <> -struct result_type { - typedef mpreal type; -}; -template <> -struct result_type { - typedef mpreal type; -}; -template <> -struct result_type { - typedef mpreal type; -}; -} // namespace internal - -// + Addition -template -inline const typename internal::result_type::type operator+(const mpreal& lhs, const Rhs& rhs) { - return mpreal(lhs) += rhs; -} - -template -inline const typename internal::result_type::type operator+(const Lhs& lhs, const mpreal& rhs) { - return mpreal(rhs) += lhs; -} - -// - Subtraction -template -inline const typename internal::result_type::type operator-(const mpreal& lhs, const Rhs& rhs) { - return mpreal(lhs) -= rhs; -} - -template -inline const typename internal::result_type::type operator-(const Lhs& lhs, const mpreal& rhs) { - return mpreal(lhs) -= rhs; -} - -// * Multiplication -template -inline const typename internal::result_type::type operator*(const mpreal& lhs, const Rhs& rhs) { - return mpreal(lhs) *= rhs; -} - -template -inline const typename internal::result_type::type operator*(const Lhs& lhs, const mpreal& rhs) { - return mpreal(rhs) *= lhs; -} - -// / Division -template -inline const typename internal::result_type::type operator/(const mpreal& lhs, const Rhs& rhs) { - return mpreal(lhs) /= rhs; -} - -template -inline const typename internal::result_type::type operator/(const Lhs& lhs, const mpreal& rhs) { - return mpreal(lhs) /= rhs; -} - -////////////////////////////////////////////////////////////////////////// -// sqrt -const mpreal sqrt(const unsigned int v, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); -const mpreal sqrt(const long int v, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); -const mpreal sqrt(const int v, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); -const mpreal sqrt(const long double v, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); -const mpreal sqrt(const double v, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); - -// abs -inline const mpreal abs(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()); - -////////////////////////////////////////////////////////////////////////// -// pow -const mpreal pow(const mpreal& a, const unsigned int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); -const mpreal pow(const mpreal& a, const int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); -const mpreal pow(const mpreal& a, const long double b, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); -const mpreal pow(const mpreal& a, const double b, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); - -const mpreal pow(const unsigned int a, const mpreal& b, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); -const mpreal pow(const long int a, const mpreal& b, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); -const mpreal pow(const int a, const mpreal& b, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); -const mpreal pow(const long double a, const mpreal& b, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); -const mpreal pow(const double a, const mpreal& b, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); - -const mpreal pow(const unsigned long int a, const unsigned int b, - mp_rnd_t rnd_mode = mpreal::get_default_rnd()); -const mpreal pow(const unsigned long int a, const long int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); -const mpreal pow(const unsigned long int a, const int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); -const mpreal pow(const unsigned long int a, const long double b, - mp_rnd_t rnd_mode = mpreal::get_default_rnd()); -const mpreal pow(const unsigned long int a, const double b, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); - -const mpreal pow(const unsigned int a, const unsigned long int b, - mp_rnd_t rnd_mode = mpreal::get_default_rnd()); -const mpreal pow(const unsigned int a, const unsigned int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); -const mpreal pow(const unsigned int a, const long int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); -const mpreal pow(const unsigned int a, const int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); -const mpreal pow(const unsigned int a, const long double b, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); -const mpreal pow(const unsigned int a, const double b, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); - -const mpreal pow(const long int a, const unsigned long int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); -const mpreal pow(const long int a, const unsigned int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); -const mpreal pow(const long int a, const long int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); -const mpreal pow(const long int a, const int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); -const mpreal pow(const long int a, const long double b, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); -const mpreal pow(const long int a, const double b, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); - -const mpreal pow(const int a, const unsigned long int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); -const mpreal pow(const int a, const unsigned int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); -const mpreal pow(const int a, const long int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); -const mpreal pow(const int a, const int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); -const mpreal pow(const int a, const long double b, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); -const mpreal pow(const int a, const double b, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); - -const mpreal pow(const long double a, const long double b, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); -const mpreal pow(const long double a, const unsigned long int b, - mp_rnd_t rnd_mode = mpreal::get_default_rnd()); -const mpreal pow(const long double a, const unsigned int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); -const mpreal pow(const long double a, const long int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); -const mpreal pow(const long double a, const int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); - -const mpreal pow(const double a, const double b, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); -const mpreal pow(const double a, const unsigned long int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); -const mpreal pow(const double a, const unsigned int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); -const mpreal pow(const double a, const long int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); -const mpreal pow(const double a, const int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); - -inline const mpreal mul_2ui(const mpreal& v, unsigned long int k, - mp_rnd_t rnd_mode = mpreal::get_default_rnd()); -inline const mpreal mul_2si(const mpreal& v, long int k, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); -inline const mpreal div_2ui(const mpreal& v, unsigned long int k, - mp_rnd_t rnd_mode = mpreal::get_default_rnd()); -inline const mpreal div_2si(const mpreal& v, long int k, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); - -////////////////////////////////////////////////////////////////////////// -// Estimate machine epsilon for the given precision -// Returns smallest eps such that 1.0 + eps != 1.0 -inline mpreal machine_epsilon(mp_prec_t prec = mpreal::get_default_prec()); - -// Returns smallest eps such that x + eps != x (relative machine epsilon) -inline mpreal machine_epsilon(const mpreal& x); - -// Gives max & min values for the required precision, -// minval is 'safe' meaning 1 / minval does not overflow -// maxval is 'safe' meaning 1 / maxval does not underflow -inline mpreal minval(mp_prec_t prec = mpreal::get_default_prec()); -inline mpreal maxval(mp_prec_t prec = mpreal::get_default_prec()); - -// 'Dirty' equality check 1: |a-b| < min{|a|,|b|} * eps -inline bool isEqualFuzzy(const mpreal& a, const mpreal& b, const mpreal& eps); - -// 'Dirty' equality check 2: |a-b| < min{|a|,|b|} * eps( min{|a|,|b|} ) -inline bool isEqualFuzzy(const mpreal& a, const mpreal& b); - -// 'Bitwise' equality check -// maxUlps - a and b can be apart by maxUlps binary numbers. -inline bool isEqualUlps(const mpreal& a, const mpreal& b, int maxUlps); - -////////////////////////////////////////////////////////////////////////// -// Convert precision in 'bits' to decimal digits and vice versa. -// 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 -const mpreal(max)(const mpreal& x, const mpreal& y); -const mpreal(min)(const mpreal& x, const mpreal& y); - -////////////////////////////////////////////////////////////////////////// -// Implementation -////////////////////////////////////////////////////////////////////////// - -////////////////////////////////////////////////////////////////////////// -// Operators - Assignment -inline mpreal& mpreal::operator=(const mpreal& v) { - if (this != &v) { - mp_prec_t tp = mpfr_get_prec(mpfr_srcptr()); - mp_prec_t vp = mpfr_get_prec(v.mpfr_srcptr()); - - if (tp != vp) { - clear(mpfr_ptr()); - mpfr_init2(mpfr_ptr(), vp); - } - - mpfr_set(mpfr_ptr(), v.mpfr_srcptr(), mpreal::get_default_rnd()); - - MPREAL_MSVC_DEBUGVIEW_CODE; - } - return *this; -} - -inline mpreal& mpreal::operator=(const mpf_t v) { - mpfr_set_f(mpfr_ptr(), v, mpreal::get_default_rnd()); - - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator=(const mpz_t v) { - mpfr_set_z(mpfr_ptr(), v, mpreal::get_default_rnd()); - - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator=(const mpq_t v) { - mpfr_set_q(mpfr_ptr(), v, mpreal::get_default_rnd()); - - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator=(const long double v) { - mpfr_set_ld(mpfr_ptr(), v, mpreal::get_default_rnd()); - - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator=(const double v) { -#if (MPREAL_DOUBLE_BITS_OVERFLOW > -1) - if (fits_in_bits(v, MPREAL_DOUBLE_BITS_OVERFLOW)) { - mpfr_set_d(mpfr_ptr(), v, mpreal::get_default_rnd()); - } else - throw conversion_overflow(); -#else - mpfr_set_d(mpfr_ptr(), v, mpreal::get_default_rnd()); -#endif - - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator=(const unsigned long int v) { - mpfr_set_ui(mpfr_ptr(), v, mpreal::get_default_rnd()); - - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator=(const unsigned int v) { - mpfr_set_ui(mpfr_ptr(), v, mpreal::get_default_rnd()); - - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator=(const unsigned long long int v) { - mpfr_set_uj(mpfr_ptr(), v, mpreal::get_default_rnd()); - - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator=(const long long int v) { - mpfr_set_sj(mpfr_ptr(), v, mpreal::get_default_rnd()); - - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator=(const long int v) { - mpfr_set_si(mpfr_ptr(), v, mpreal::get_default_rnd()); - - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator=(const int v) { - mpfr_set_si(mpfr_ptr(), v, mpreal::get_default_rnd()); - - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator=(const char* s) { - // Use other converters for more precise control on base & precision & rounding: - // - // mpreal(const char* s, mp_prec_t prec, int base, mp_rnd_t mode) - // mpreal(const std::string& s,mp_prec_t prec, int base, mp_rnd_t mode) - // - // Here we assume base = 10 and we use precision of target variable. - - mpfr_t t; - - mpfr_init2(t, mpfr_get_prec(mpfr_srcptr())); - - if (0 == mpfr_set_str(t, s, 10, mpreal::get_default_rnd())) { - mpfr_set(mpfr_ptr(), t, mpreal::get_default_rnd()); - MPREAL_MSVC_DEBUGVIEW_CODE; - } - - clear(t); - return *this; -} - -inline mpreal& mpreal::operator=(const std::string& s) { - // Use other converters for more precise control on base & precision & rounding: - // - // mpreal(const char* s, mp_prec_t prec, int base, mp_rnd_t mode) - // mpreal(const std::string& s,mp_prec_t prec, int base, mp_rnd_t mode) - // - // Here we assume base = 10 and we use precision of target variable. - - mpfr_t t; - - mpfr_init2(t, mpfr_get_prec(mpfr_srcptr())); - - if (0 == mpfr_set_str(t, s.c_str(), 10, mpreal::get_default_rnd())) { - mpfr_set(mpfr_ptr(), t, mpreal::get_default_rnd()); - MPREAL_MSVC_DEBUGVIEW_CODE; - } - - clear(t); - return *this; -} - -template -inline mpreal& mpreal::operator=(const std::complex& z) { - return *this = z.real(); -} - -////////////////////////////////////////////////////////////////////////// -// + Addition -inline mpreal& mpreal::operator+=(const mpreal& v) { - mpfr_add(mpfr_ptr(), mpfr_srcptr(), v.mpfr_srcptr(), mpreal::get_default_rnd()); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator+=(const mpf_t u) { - *this += mpreal(u); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator+=(const mpz_t u) { - mpfr_add_z(mpfr_ptr(), mpfr_srcptr(), u, mpreal::get_default_rnd()); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator+=(const mpq_t u) { - mpfr_add_q(mpfr_ptr(), mpfr_srcptr(), u, mpreal::get_default_rnd()); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator+=(const long double u) { - *this += mpreal(u); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator+=(const double u) { -#if (MPFR_VERSION >= MPFR_VERSION_NUM(2, 4, 0)) - mpfr_add_d(mpfr_ptr(), mpfr_srcptr(), u, mpreal::get_default_rnd()); -#else - *this += mpreal(u); -#endif - - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator+=(const unsigned long int u) { - mpfr_add_ui(mpfr_ptr(), mpfr_srcptr(), u, mpreal::get_default_rnd()); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator+=(const unsigned int u) { - mpfr_add_ui(mpfr_ptr(), mpfr_srcptr(), u, mpreal::get_default_rnd()); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator+=(const long int u) { - mpfr_add_si(mpfr_ptr(), mpfr_srcptr(), u, mpreal::get_default_rnd()); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator+=(const int u) { - mpfr_add_si(mpfr_ptr(), mpfr_srcptr(), u, mpreal::get_default_rnd()); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator+=(const long long int u) { - *this += mpreal(u); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} -inline mpreal& mpreal::operator+=(const unsigned long long int u) { - *this += mpreal(u); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} -inline mpreal& mpreal::operator-=(const long long int u) { - *this -= mpreal(u); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} -inline mpreal& mpreal::operator-=(const unsigned long long int u) { - *this -= mpreal(u); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} -inline mpreal& mpreal::operator*=(const long long int u) { - *this *= mpreal(u); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} -inline mpreal& mpreal::operator*=(const unsigned long long int u) { - *this *= mpreal(u); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} -inline mpreal& mpreal::operator/=(const long long int u) { - *this /= mpreal(u); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} -inline mpreal& mpreal::operator/=(const unsigned long long int u) { - *this /= mpreal(u); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline const mpreal mpreal::operator+() const { return mpreal(*this); } - -inline const mpreal operator+(const mpreal& a, const mpreal& b) { - mpreal c(0, (std::max)(mpfr_get_prec(a.mpfr_ptr()), mpfr_get_prec(b.mpfr_ptr()))); - mpfr_add(c.mpfr_ptr(), a.mpfr_srcptr(), b.mpfr_srcptr(), mpreal::get_default_rnd()); - return c; -} - -inline mpreal& mpreal::operator++() { return *this += 1; } - -inline const mpreal mpreal::operator++(int) { - mpreal x(*this); - *this += 1; - return x; -} - -inline mpreal& mpreal::operator--() { return *this -= 1; } - -inline const mpreal mpreal::operator--(int) { - mpreal x(*this); - *this -= 1; - return x; -} - -////////////////////////////////////////////////////////////////////////// -// - Subtraction -inline mpreal& mpreal::operator-=(const mpreal& v) { - mpfr_sub(mpfr_ptr(), mpfr_srcptr(), v.mpfr_srcptr(), mpreal::get_default_rnd()); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator-=(const mpz_t v) { - mpfr_sub_z(mpfr_ptr(), mpfr_srcptr(), v, mpreal::get_default_rnd()); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator-=(const mpq_t v) { - mpfr_sub_q(mpfr_ptr(), mpfr_srcptr(), v, mpreal::get_default_rnd()); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator-=(const long double v) { - *this -= mpreal(v); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator-=(const double v) { -#if (MPFR_VERSION >= MPFR_VERSION_NUM(2, 4, 0)) - mpfr_sub_d(mpfr_ptr(), mpfr_srcptr(), v, mpreal::get_default_rnd()); -#else - *this -= mpreal(v); -#endif - - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator-=(const unsigned long int v) { - mpfr_sub_ui(mpfr_ptr(), mpfr_srcptr(), v, mpreal::get_default_rnd()); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator-=(const unsigned int v) { - mpfr_sub_ui(mpfr_ptr(), mpfr_srcptr(), v, mpreal::get_default_rnd()); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator-=(const long int v) { - mpfr_sub_si(mpfr_ptr(), mpfr_srcptr(), v, mpreal::get_default_rnd()); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator-=(const int v) { - mpfr_sub_si(mpfr_ptr(), mpfr_srcptr(), v, mpreal::get_default_rnd()); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline const mpreal mpreal::operator-() const { - mpreal u(*this); - mpfr_neg(u.mpfr_ptr(), u.mpfr_srcptr(), mpreal::get_default_rnd()); - return u; -} - -inline const mpreal operator-(const mpreal& a, const mpreal& b) { - mpreal c(0, (std::max)(mpfr_get_prec(a.mpfr_ptr()), mpfr_get_prec(b.mpfr_ptr()))); - mpfr_sub(c.mpfr_ptr(), a.mpfr_srcptr(), b.mpfr_srcptr(), mpreal::get_default_rnd()); - return c; -} - -inline const mpreal operator-(const double b, const mpreal& a) { -#if (MPFR_VERSION >= MPFR_VERSION_NUM(2, 4, 0)) - mpreal x(0, mpfr_get_prec(a.mpfr_ptr())); - mpfr_d_sub(x.mpfr_ptr(), b, a.mpfr_srcptr(), mpreal::get_default_rnd()); - return x; -#else - mpreal x(b, mpfr_get_prec(a.mpfr_ptr())); - x -= a; - return x; -#endif -} - -inline const mpreal operator-(const unsigned long int b, const mpreal& a) { - mpreal x(0, mpfr_get_prec(a.mpfr_ptr())); - mpfr_ui_sub(x.mpfr_ptr(), b, a.mpfr_srcptr(), mpreal::get_default_rnd()); - return x; -} - -inline const mpreal operator-(const unsigned int b, const mpreal& a) { - mpreal x(0, mpfr_get_prec(a.mpfr_ptr())); - mpfr_ui_sub(x.mpfr_ptr(), b, a.mpfr_srcptr(), mpreal::get_default_rnd()); - return x; -} - -inline const mpreal operator-(const long int b, const mpreal& a) { - mpreal x(0, mpfr_get_prec(a.mpfr_ptr())); - mpfr_si_sub(x.mpfr_ptr(), b, a.mpfr_srcptr(), mpreal::get_default_rnd()); - return x; -} - -inline const mpreal operator-(const int b, const mpreal& a) { - mpreal x(0, mpfr_get_prec(a.mpfr_ptr())); - mpfr_si_sub(x.mpfr_ptr(), b, a.mpfr_srcptr(), mpreal::get_default_rnd()); - return x; -} - -////////////////////////////////////////////////////////////////////////// -// * Multiplication -inline mpreal& mpreal::operator*=(const mpreal& v) { - mpfr_mul(mpfr_ptr(), mpfr_srcptr(), v.mpfr_srcptr(), mpreal::get_default_rnd()); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator*=(const mpz_t v) { - mpfr_mul_z(mpfr_ptr(), mpfr_srcptr(), v, mpreal::get_default_rnd()); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator*=(const mpq_t v) { - mpfr_mul_q(mpfr_ptr(), mpfr_srcptr(), v, mpreal::get_default_rnd()); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator*=(const long double v) { - *this *= mpreal(v); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator*=(const double v) { -#if (MPFR_VERSION >= MPFR_VERSION_NUM(2, 4, 0)) - mpfr_mul_d(mpfr_ptr(), mpfr_srcptr(), v, mpreal::get_default_rnd()); -#else - *this *= mpreal(v); -#endif - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator*=(const unsigned long int v) { - mpfr_mul_ui(mpfr_ptr(), mpfr_srcptr(), v, mpreal::get_default_rnd()); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator*=(const unsigned int v) { - mpfr_mul_ui(mpfr_ptr(), mpfr_srcptr(), v, mpreal::get_default_rnd()); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator*=(const long int v) { - mpfr_mul_si(mpfr_ptr(), mpfr_srcptr(), v, mpreal::get_default_rnd()); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator*=(const int v) { - mpfr_mul_si(mpfr_ptr(), mpfr_srcptr(), v, mpreal::get_default_rnd()); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline const mpreal operator*(const mpreal& a, const mpreal& b) { - mpreal c(0, (std::max)(mpfr_get_prec(a.mpfr_ptr()), mpfr_get_prec(b.mpfr_ptr()))); - mpfr_mul(c.mpfr_ptr(), a.mpfr_srcptr(), b.mpfr_srcptr(), mpreal::get_default_rnd()); - return c; -} - -////////////////////////////////////////////////////////////////////////// -// / Division -inline mpreal& mpreal::operator/=(const mpreal& v) { - mpfr_div(mpfr_ptr(), mpfr_srcptr(), v.mpfr_srcptr(), mpreal::get_default_rnd()); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator/=(const mpz_t v) { - mpfr_div_z(mpfr_ptr(), mpfr_srcptr(), v, mpreal::get_default_rnd()); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator/=(const mpq_t v) { - mpfr_div_q(mpfr_ptr(), mpfr_srcptr(), v, mpreal::get_default_rnd()); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator/=(const long double v) { - *this /= mpreal(v); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator/=(const double v) { -#if (MPFR_VERSION >= MPFR_VERSION_NUM(2, 4, 0)) - mpfr_div_d(mpfr_ptr(), mpfr_srcptr(), v, mpreal::get_default_rnd()); -#else - *this /= mpreal(v); -#endif - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator/=(const unsigned long int v) { - mpfr_div_ui(mpfr_ptr(), mpfr_srcptr(), v, mpreal::get_default_rnd()); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator/=(const unsigned int v) { - mpfr_div_ui(mpfr_ptr(), mpfr_srcptr(), v, mpreal::get_default_rnd()); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator/=(const long int v) { - mpfr_div_si(mpfr_ptr(), mpfr_srcptr(), v, mpreal::get_default_rnd()); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator/=(const int v) { - mpfr_div_si(mpfr_ptr(), mpfr_srcptr(), v, mpreal::get_default_rnd()); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline const mpreal operator/(const mpreal& a, const mpreal& b) { - mpreal c(0, (std::max)(mpfr_get_prec(a.mpfr_srcptr()), mpfr_get_prec(b.mpfr_srcptr()))); - mpfr_div(c.mpfr_ptr(), a.mpfr_srcptr(), b.mpfr_srcptr(), mpreal::get_default_rnd()); - return c; -} - -inline const mpreal operator/(const unsigned long int b, const mpreal& a) { - mpreal x(0, mpfr_get_prec(a.mpfr_srcptr())); - mpfr_ui_div(x.mpfr_ptr(), b, a.mpfr_srcptr(), mpreal::get_default_rnd()); - return x; -} - -inline const mpreal operator/(const unsigned int b, const mpreal& a) { - mpreal x(0, mpfr_get_prec(a.mpfr_srcptr())); - mpfr_ui_div(x.mpfr_ptr(), b, a.mpfr_srcptr(), mpreal::get_default_rnd()); - return x; -} - -inline const mpreal operator/(const long int b, const mpreal& a) { - mpreal x(0, mpfr_get_prec(a.mpfr_srcptr())); - mpfr_si_div(x.mpfr_ptr(), b, a.mpfr_srcptr(), mpreal::get_default_rnd()); - return x; -} - -inline const mpreal operator/(const int b, const mpreal& a) { - mpreal x(0, mpfr_get_prec(a.mpfr_srcptr())); - mpfr_si_div(x.mpfr_ptr(), b, a.mpfr_srcptr(), mpreal::get_default_rnd()); - return x; -} - -inline const mpreal operator/(const double b, const mpreal& a) { -#if (MPFR_VERSION >= MPFR_VERSION_NUM(2, 4, 0)) - mpreal x(0, mpfr_get_prec(a.mpfr_srcptr())); - mpfr_d_div(x.mpfr_ptr(), b, a.mpfr_srcptr(), mpreal::get_default_rnd()); - return x; -#else - mpreal x(0, mpfr_get_prec(a.mpfr_ptr())); - x /= a; - return x; -#endif -} - -////////////////////////////////////////////////////////////////////////// -// Shifts operators - Multiplication/Division by power of 2 -inline mpreal& mpreal::operator<<=(const unsigned long int u) { - mpfr_mul_2ui(mpfr_ptr(), mpfr_srcptr(), u, mpreal::get_default_rnd()); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator<<=(const unsigned int u) { - mpfr_mul_2ui(mpfr_ptr(), mpfr_srcptr(), static_cast(u), mpreal::get_default_rnd()); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator<<=(const long int u) { - mpfr_mul_2si(mpfr_ptr(), mpfr_srcptr(), u, mpreal::get_default_rnd()); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator<<=(const int u) { - mpfr_mul_2si(mpfr_ptr(), mpfr_srcptr(), static_cast(u), mpreal::get_default_rnd()); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator>>=(const unsigned long int u) { - mpfr_div_2ui(mpfr_ptr(), mpfr_srcptr(), u, mpreal::get_default_rnd()); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator>>=(const unsigned int u) { - mpfr_div_2ui(mpfr_ptr(), mpfr_srcptr(), static_cast(u), mpreal::get_default_rnd()); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator>>=(const long int u) { - mpfr_div_2si(mpfr_ptr(), mpfr_srcptr(), u, mpreal::get_default_rnd()); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::operator>>=(const int u) { - mpfr_div_2si(mpfr_ptr(), mpfr_srcptr(), static_cast(u), mpreal::get_default_rnd()); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline const mpreal operator<<(const mpreal& v, const unsigned long int k) { return mul_2ui(v, k); } - -inline const mpreal operator<<(const mpreal& v, const unsigned int k) { - return mul_2ui(v, static_cast(k)); -} - -inline const mpreal operator<<(const mpreal& v, const long int k) { return mul_2si(v, k); } - -inline const mpreal operator<<(const mpreal& v, const int k) { return mul_2si(v, static_cast(k)); } - -inline const mpreal operator>>(const mpreal& v, const unsigned long int k) { return div_2ui(v, k); } - -inline const mpreal operator>>(const mpreal& v, const long int k) { return div_2si(v, k); } - -inline const mpreal operator>>(const mpreal& v, const unsigned int k) { - return div_2ui(v, static_cast(k)); -} - -inline const mpreal operator>>(const mpreal& v, const int k) { return div_2si(v, static_cast(k)); } - -// mul_2ui -inline const mpreal mul_2ui(const mpreal& v, unsigned long int k, mp_rnd_t rnd_mode) { - mpreal x(v); - mpfr_mul_2ui(x.mpfr_ptr(), v.mpfr_srcptr(), k, rnd_mode); - return x; -} - -// mul_2si -inline const mpreal mul_2si(const mpreal& v, long int k, mp_rnd_t rnd_mode) { - mpreal x(v); - mpfr_mul_2si(x.mpfr_ptr(), v.mpfr_srcptr(), k, rnd_mode); - return x; -} - -inline const mpreal div_2ui(const mpreal& v, unsigned long int k, mp_rnd_t rnd_mode) { - mpreal x(v); - mpfr_div_2ui(x.mpfr_ptr(), v.mpfr_srcptr(), k, rnd_mode); - return x; -} - -inline const mpreal div_2si(const mpreal& v, long int k, mp_rnd_t rnd_mode) { - mpreal x(v); - mpfr_div_2si(x.mpfr_ptr(), v.mpfr_srcptr(), k, rnd_mode); - return x; -} - -////////////////////////////////////////////////////////////////////////// -// Relational operators - -// WARNING: -// -// Please note that following checks for double-NaN are guaranteed to work only in IEEE math mode: -// -// isnan(b) = (b != b) -// isnan(b) = !(b == b) (we use in code below) -// -// Be cautions if you use compiler options which break strict IEEE compliance (e.g. -ffast-math in GCC). -// Use std::isnan instead (C++11). - -inline bool operator>(const mpreal& a, const mpreal& b) { - return (mpfr_greater_p(a.mpfr_srcptr(), b.mpfr_srcptr()) != 0); -} -inline bool operator>(const mpreal& a, const unsigned long int b) { - return !isnan(a) && (mpfr_cmp_ui(a.mpfr_srcptr(), b) > 0); -} -inline bool operator>(const mpreal& a, const unsigned int b) { - return !isnan(a) && (mpfr_cmp_ui(a.mpfr_srcptr(), b) > 0); -} -inline bool operator>(const mpreal& a, const long int b) { - return !isnan(a) && (mpfr_cmp_si(a.mpfr_srcptr(), b) > 0); -} -inline bool operator>(const mpreal& a, const int b) { - return !isnan(a) && (mpfr_cmp_si(a.mpfr_srcptr(), b) > 0); -} -inline bool operator>(const mpreal& a, const long double b) { - return !isnan(a) && (b == b) && (mpfr_cmp_ld(a.mpfr_srcptr(), b) > 0); -} -inline bool operator>(const mpreal& a, const double b) { - return !isnan(a) && (b == b) && (mpfr_cmp_d(a.mpfr_srcptr(), b) > 0); -} - -inline bool operator>=(const mpreal& a, const mpreal& b) { - return (mpfr_greaterequal_p(a.mpfr_srcptr(), b.mpfr_srcptr()) != 0); -} -inline bool operator>=(const mpreal& a, const unsigned long int b) { - return !isnan(a) && (mpfr_cmp_ui(a.mpfr_srcptr(), b) >= 0); -} -inline bool operator>=(const mpreal& a, const unsigned int b) { - return !isnan(a) && (mpfr_cmp_ui(a.mpfr_srcptr(), b) >= 0); -} -inline bool operator>=(const mpreal& a, const long int b) { - return !isnan(a) && (mpfr_cmp_si(a.mpfr_srcptr(), b) >= 0); -} -inline bool operator>=(const mpreal& a, const int b) { - return !isnan(a) && (mpfr_cmp_si(a.mpfr_srcptr(), b) >= 0); -} -inline bool operator>=(const mpreal& a, const long double b) { - return !isnan(a) && (b == b) && (mpfr_cmp_ld(a.mpfr_srcptr(), b) >= 0); -} -inline bool operator>=(const mpreal& a, const double b) { - return !isnan(a) && (b == b) && (mpfr_cmp_d(a.mpfr_srcptr(), b) >= 0); -} - -inline bool operator<(const mpreal& a, const mpreal& b) { - return (mpfr_less_p(a.mpfr_srcptr(), b.mpfr_srcptr()) != 0); -} -inline bool operator<(const mpreal& a, const unsigned long int b) { - return !isnan(a) && (mpfr_cmp_ui(a.mpfr_srcptr(), b) < 0); -} -inline bool operator<(const mpreal& a, const unsigned int b) { - return !isnan(a) && (mpfr_cmp_ui(a.mpfr_srcptr(), b) < 0); -} -inline bool operator<(const mpreal& a, const long int b) { - return !isnan(a) && (mpfr_cmp_si(a.mpfr_srcptr(), b) < 0); -} -inline bool operator<(const mpreal& a, const int b) { - return !isnan(a) && (mpfr_cmp_si(a.mpfr_srcptr(), b) < 0); -} -inline bool operator<(const mpreal& a, const long double b) { - return !isnan(a) && (b == b) && (mpfr_cmp_ld(a.mpfr_srcptr(), b) < 0); -} -inline bool operator<(const mpreal& a, const double b) { - return !isnan(a) && (b == b) && (mpfr_cmp_d(a.mpfr_srcptr(), b) < 0); -} - -inline bool operator<=(const mpreal& a, const mpreal& b) { - return (mpfr_lessequal_p(a.mpfr_srcptr(), b.mpfr_srcptr()) != 0); -} -inline bool operator<=(const mpreal& a, const unsigned long int b) { - return !isnan(a) && (mpfr_cmp_ui(a.mpfr_srcptr(), b) <= 0); -} -inline bool operator<=(const mpreal& a, const unsigned int b) { - return !isnan(a) && (mpfr_cmp_ui(a.mpfr_srcptr(), b) <= 0); -} -inline bool operator<=(const mpreal& a, const long int b) { - return !isnan(a) && (mpfr_cmp_si(a.mpfr_srcptr(), b) <= 0); -} -inline bool operator<=(const mpreal& a, const int b) { - return !isnan(a) && (mpfr_cmp_si(a.mpfr_srcptr(), b) <= 0); -} -inline bool operator<=(const mpreal& a, const long double b) { - return !isnan(a) && (b == b) && (mpfr_cmp_ld(a.mpfr_srcptr(), b) <= 0); -} -inline bool operator<=(const mpreal& a, const double b) { - return !isnan(a) && (b == b) && (mpfr_cmp_d(a.mpfr_srcptr(), b) <= 0); -} - -inline bool operator==(const mpreal& a, const mpreal& b) { - return (mpfr_equal_p(a.mpfr_srcptr(), b.mpfr_srcptr()) != 0); -} -inline bool operator==(const mpreal& a, const unsigned long int b) { - return !isnan(a) && (mpfr_cmp_ui(a.mpfr_srcptr(), b) == 0); -} -inline bool operator==(const mpreal& a, const unsigned int b) { - return !isnan(a) && (mpfr_cmp_ui(a.mpfr_srcptr(), b) == 0); -} -inline bool operator==(const mpreal& a, const long int b) { - return !isnan(a) && (mpfr_cmp_si(a.mpfr_srcptr(), b) == 0); -} -inline bool operator==(const mpreal& a, const int b) { - return !isnan(a) && (mpfr_cmp_si(a.mpfr_srcptr(), b) == 0); -} -inline bool operator==(const mpreal& a, const long double b) { - return !isnan(a) && (b == b) && (mpfr_cmp_ld(a.mpfr_srcptr(), b) == 0); -} -inline bool operator==(const mpreal& a, const double b) { - return !isnan(a) && (b == b) && (mpfr_cmp_d(a.mpfr_srcptr(), b) == 0); -} - -inline bool operator!=(const mpreal& a, const mpreal& b) { return !(a == b); } -inline bool operator!=(const mpreal& a, const unsigned long int b) { return !(a == b); } -inline bool operator!=(const mpreal& a, const unsigned int b) { return !(a == b); } -inline bool operator!=(const mpreal& a, const long int b) { return !(a == b); } -inline bool operator!=(const mpreal& a, const int b) { return !(a == b); } -inline bool operator!=(const mpreal& a, const long double b) { return !(a == b); } -inline bool operator!=(const mpreal& a, const double b) { return !(a == b); } - -inline bool isnan(const mpreal& op) { return (mpfr_nan_p(op.mpfr_srcptr()) != 0); } -inline bool isinf(const mpreal& op) { return (mpfr_inf_p(op.mpfr_srcptr()) != 0); } -inline bool isfinite(const mpreal& op) { return (mpfr_number_p(op.mpfr_srcptr()) != 0); } -inline bool iszero(const mpreal& op) { return (mpfr_zero_p(op.mpfr_srcptr()) != 0); } -inline bool isint(const mpreal& op) { return (mpfr_integer_p(op.mpfr_srcptr()) != 0); } - -#if (MPFR_VERSION >= MPFR_VERSION_NUM(3, 0, 0)) -inline bool isregular(const mpreal& op) { return (mpfr_regular_p(op.mpfr_srcptr())); } -#endif - -////////////////////////////////////////////////////////////////////////// -// Type Converters -inline bool mpreal::toBool() const { return mpfr_zero_p(mpfr_srcptr()) == 0; } -inline long mpreal::toLong(mp_rnd_t mode) const { return mpfr_get_si(mpfr_srcptr(), mode); } -inline unsigned long mpreal::toULong(mp_rnd_t mode) const { return mpfr_get_ui(mpfr_srcptr(), mode); } -inline float mpreal::toFloat(mp_rnd_t mode) const { return mpfr_get_flt(mpfr_srcptr(), mode); } -inline double mpreal::toDouble(mp_rnd_t mode) const { return mpfr_get_d(mpfr_srcptr(), mode); } -inline long double mpreal::toLDouble(mp_rnd_t mode) const { return mpfr_get_ld(mpfr_srcptr(), mode); } -inline long long mpreal::toLLong(mp_rnd_t mode) const { return mpfr_get_sj(mpfr_srcptr(), mode); } -inline unsigned long long mpreal::toULLong(mp_rnd_t mode) const { return mpfr_get_uj(mpfr_srcptr(), mode); } - -inline ::mpfr_ptr mpreal::mpfr_ptr() { return mp; } -inline ::mpfr_srcptr mpreal::mpfr_ptr() const { return mp; } -inline ::mpfr_srcptr mpreal::mpfr_srcptr() const { return mp; } - -template -inline std::string toString(T t, std::ios_base& (*f)(std::ios_base&)) { - std::ostringstream oss; - oss << f << t; - return oss.str(); -} - -#if (MPFR_VERSION >= MPFR_VERSION_NUM(2, 4, 0)) - -inline std::string mpreal::toString(const std::string& format) const { - char* s = NULL; - std::string out; - - if (!format.empty()) { - if (!(mpfr_asprintf(&s, format.c_str(), mpfr_srcptr()) < 0)) { - out = std::string(s); - - mpfr_free_str(s); - } - } - - return out; -} - -#endif - -inline std::string mpreal::toString(int n, int b, mp_rnd_t mode) const { - // TODO: Add extended format specification (f, e, rounding mode) as it done in output operator - (void)b; - (void)mode; - -#if (MPFR_VERSION >= MPFR_VERSION_NUM(2, 4, 0)) - - std::ostringstream format; - - int digits = (n >= 0) ? n : 1 + bits2digits(mpfr_get_prec(mpfr_srcptr())); - - format << "%." << digits << "RNg"; - - return toString(format.str()); - -#else - - char *s, *ns = NULL; - size_t slen, nslen; - mp_exp_t exp; - std::string out; - - if (mpfr_inf_p(mp)) { - if (mpfr_sgn(mp) > 0) - return "+Inf"; - else - return "-Inf"; - } - - if (mpfr_zero_p(mp)) return "0"; - if (mpfr_nan_p(mp)) return "NaN"; - - s = mpfr_get_str(NULL, &exp, b, 0, mp, mode); - ns = mpfr_get_str(NULL, &exp, b, (std::max)(0, n), mp, mode); - - if (s != NULL && ns != NULL) { - slen = strlen(s); - nslen = strlen(ns); - if (nslen <= slen) { - mpfr_free_str(s); - s = ns; - slen = nslen; - } else { - mpfr_free_str(ns); - } - - // Make human eye-friendly formatting if possible - if (exp > 0 && static_cast(exp) < slen) { - if (s[0] == '-') { - // Remove zeros starting from right end - char* ptr = s + slen - 1; - while (*ptr == '0' && ptr > s + exp) ptr--; - - if (ptr == s + exp) - out = std::string(s, exp + 1); - else - out = std::string(s, exp + 1) + '.' + std::string(s + exp + 1, ptr - (s + exp + 1) + 1); - - // out = string(s,exp+1)+'.'+string(s+exp+1); - } else { - // Remove zeros starting from right end - char* ptr = s + slen - 1; - while (*ptr == '0' && ptr > s + exp - 1) ptr--; - - if (ptr == s + exp - 1) - out = std::string(s, exp); - else - out = std::string(s, exp) + '.' + std::string(s + exp, ptr - (s + exp) + 1); - - // out = string(s,exp)+'.'+string(s+exp); - } - - } else { // exp<0 || exp>slen - if (s[0] == '-') { - // Remove zeros starting from right end - char* ptr = s + slen - 1; - while (*ptr == '0' && ptr > s + 1) ptr--; - - if (ptr == s + 1) - out = std::string(s, 2); - else - out = std::string(s, 2) + '.' + std::string(s + 2, ptr - (s + 2) + 1); - - // out = string(s,2)+'.'+string(s+2); - } else { - // Remove zeros starting from right end - char* ptr = s + slen - 1; - while (*ptr == '0' && ptr > s) ptr--; - - if (ptr == s) - out = std::string(s, 1); - else - out = std::string(s, 1) + '.' + std::string(s + 1, ptr - (s + 1) + 1); - - // out = string(s,1)+'.'+string(s+1); - } - - // Make final string - if (--exp) { - if (exp > 0) - out += "e+" + mpfr::toString(exp, std::dec); - else - out += "e" + mpfr::toString(exp, std::dec); - } - } - - mpfr_free_str(s); - return out; - } else { - return "conversion error!"; - } -#endif -} - -////////////////////////////////////////////////////////////////////////// -// I/O -inline std::ostream& mpreal::output(std::ostream& os) const { - std::ostringstream format; - const std::ios::fmtflags flags = os.flags(); - - format << ((flags & std::ios::showpos) ? "%+" : "%"); - if (os.precision() >= 0) - format << '.' << os.precision() << "R*" - << ((flags & std::ios::floatfield) == std::ios::fixed ? 'f' - : (flags & std::ios::floatfield) == std::ios::scientific ? 'e' - : 'g'); - else - format << "R*e"; - - char* s = NULL; - if (!(mpfr_asprintf(&s, format.str().c_str(), mpfr::mpreal::get_default_rnd(), mpfr_srcptr()) < 0)) { - os << std::string(s); - mpfr_free_str(s); - } - return os; -} - -inline std::ostream& operator<<(std::ostream& os, const mpreal& v) { return v.output(os); } - -inline std::istream& operator>>(std::istream& is, mpreal& v) { - // TODO: use cout::hexfloat and other flags to setup base - std::string tmp; - is >> tmp; - mpfr_set_str(v.mpfr_ptr(), tmp.c_str(), 10, mpreal::get_default_rnd()); - return is; -} - -////////////////////////////////////////////////////////////////////////// -// Bits - decimal digits relation -// bits = ceil(digits*log[2](10)) -// digits = floor(bits*log[10](2)) - -inline mp_prec_t digits2bits(int d) { - const double LOG2_10 = 3.3219280948873624; - - return mp_prec_t(std::ceil(d * LOG2_10)); -} - -inline int bits2digits(mp_prec_t b) { - const double LOG10_2 = 0.30102999566398119; - - return int(std::floor(b * LOG10_2)); -} - -////////////////////////////////////////////////////////////////////////// -// Set/Get number properties -inline int sgn(const mpreal& op) { return mpfr_sgn(op.mpfr_srcptr()); } - -inline mpreal& mpreal::setSign(int sign, mp_rnd_t RoundingMode) { - mpfr_setsign(mpfr_ptr(), mpfr_srcptr(), (sign < 0 ? 1 : 0), RoundingMode); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline int mpreal::getPrecision() const { return int(mpfr_get_prec(mpfr_srcptr())); } - -inline mpreal& mpreal::setPrecision(int Precision, mp_rnd_t RoundingMode) { - mpfr_prec_round(mpfr_ptr(), Precision, RoundingMode); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::setInf(int sign) { - mpfr_set_inf(mpfr_ptr(), sign); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::setNan() { - mpfr_set_nan(mpfr_ptr()); - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mpreal& mpreal::setZero(int sign) { -#if (MPFR_VERSION >= MPFR_VERSION_NUM(3, 0, 0)) - mpfr_set_zero(mpfr_ptr(), sign); -#else - mpfr_set_si(mpfr_ptr(), 0, (mpfr_get_default_rounding_mode)()); - setSign(sign); -#endif - - MPREAL_MSVC_DEBUGVIEW_CODE; - return *this; -} - -inline mp_prec_t mpreal::get_prec() const { return mpfr_get_prec(mpfr_srcptr()); } - -inline void mpreal::set_prec(mp_prec_t prec, mp_rnd_t rnd_mode) { - mpfr_prec_round(mpfr_ptr(), prec, rnd_mode); - MPREAL_MSVC_DEBUGVIEW_CODE; -} - -inline mp_exp_t mpreal::get_exp() { return mpfr_get_exp(mpfr_srcptr()); } - -inline int mpreal::set_exp(mp_exp_t e) { - int x = mpfr_set_exp(mpfr_ptr(), e); - MPREAL_MSVC_DEBUGVIEW_CODE; - return x; -} - -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 are just increasing the exponent (= exact operation) - mpfr_mul_2si(x.mpfr_ptr(), x.mpfr_srcptr(), exp, mpreal::get_default_rnd()); - return x; -} - -inline const mpreal scalbn(const mpreal& v, mp_exp_t exp) { return ldexp(v, exp); } - -inline mpreal machine_epsilon(mp_prec_t prec) { - /* the smallest eps such that 1 + eps != 1 */ - return machine_epsilon(mpreal(1, prec)); -} - -inline mpreal machine_epsilon(const mpreal& x) { - /* the smallest eps such that x + eps != x */ - if (x < 0) { - return nextabove(-x) + x; - } else { - return nextabove(x) - x; - } -} - -// minval is 'safe' meaning 1 / minval does not overflow -inline mpreal minval(mp_prec_t prec) { - /* min = 1/2 * 2^emin = 2^(emin - 1) */ - return mpreal(1, prec) << mpreal::get_emin() - 1; -} - -// maxval is 'safe' meaning 1 / maxval does not underflow -inline mpreal maxval(mp_prec_t prec) { - /* max = (1 - eps) * 2^emax, eps is machine epsilon */ - return (mpreal(1, prec) - machine_epsilon(prec)) << mpreal::get_emax(); -} - -inline bool isEqualUlps(const mpreal& a, const mpreal& b, int maxUlps) { - return abs(a - b) <= machine_epsilon((max)(abs(a), abs(b))) * maxUlps; -} - -inline bool isEqualFuzzy(const mpreal& a, const mpreal& b, const mpreal& eps) { return abs(a - b) <= eps; } - -inline bool isEqualFuzzy(const mpreal& a, const mpreal& b) { - return isEqualFuzzy(a, b, machine_epsilon((max)(1, (min)(abs(a), abs(b))))); -} - -////////////////////////////////////////////////////////////////////////// -// C++11 sign functions. -inline mpreal copysign(const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode = mpreal::get_default_rnd()) { - mpreal rop(0, mpfr_get_prec(x.mpfr_ptr())); - mpfr_setsign(rop.mpfr_ptr(), x.mpfr_srcptr(), mpfr_signbit(y.mpfr_srcptr()), rnd_mode); - return rop; -} - -inline bool signbit(const mpreal& x) { return mpfr_signbit(x.mpfr_srcptr()); } - -inline const mpreal modf(const mpreal& v, mpreal& n) { - mpreal f(v); - - // rounding is not important since we are using the same number - mpfr_frac(f.mpfr_ptr(), f.mpfr_srcptr(), mpreal::get_default_rnd()); - mpfr_trunc(n.mpfr_ptr(), v.mpfr_srcptr()); - return f; -} - -inline int mpreal::check_range(int t, mp_rnd_t rnd_mode) { return mpfr_check_range(mpfr_ptr(), t, rnd_mode); } - -inline int mpreal::subnormalize(int t, mp_rnd_t rnd_mode) { - int r = mpfr_subnormalize(mpfr_ptr(), t, rnd_mode); - MPREAL_MSVC_DEBUGVIEW_CODE; - return r; -} - -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 -////////////////////////////////////////////////////////////////////////// -#define MPREAL_UNARY_MATH_FUNCTION_BODY(f) \ - mpreal y(0, mpfr_get_prec(x.mpfr_srcptr())); \ - mpfr_##f(y.mpfr_ptr(), x.mpfr_srcptr(), r); \ - return y; - -inline const mpreal sqr(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(sqr); -} - -inline const mpreal sqrt(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(sqrt); -} - -inline const mpreal sqrt(const unsigned long int x, mp_rnd_t r) { - mpreal y; - mpfr_sqrt_ui(y.mpfr_ptr(), x, r); - return y; -} - -inline const mpreal sqrt(const unsigned int v, mp_rnd_t rnd_mode) { - return sqrt(static_cast(v), rnd_mode); -} - -inline const mpreal sqrt(const long int v, mp_rnd_t rnd_mode) { - if (v >= 0) - return sqrt(static_cast(v), rnd_mode); - else - return mpreal().setNan(); // NaN -} - -inline const mpreal sqrt(const int v, mp_rnd_t rnd_mode) { - if (v >= 0) - return sqrt(static_cast(v), rnd_mode); - else - return mpreal().setNan(); // NaN -} - -inline const mpreal root(const mpreal& x, unsigned long int k, mp_rnd_t r = mpreal::get_default_rnd()) { - mpreal y(0, mpfr_get_prec(x.mpfr_srcptr())); - mpfr_rootn_ui(y.mpfr_ptr(), x.mpfr_srcptr(), k, r); - return y; -} - -inline const mpreal dim(const mpreal& a, const mpreal& b, mp_rnd_t r = mpreal::get_default_rnd()) { - mpreal y(0, mpfr_get_prec(a.mpfr_srcptr())); - mpfr_dim(y.mpfr_ptr(), a.mpfr_srcptr(), b.mpfr_srcptr(), r); - return y; -} - -inline int cmpabs(const mpreal& a, const mpreal& b) { return mpfr_cmpabs(a.mpfr_ptr(), b.mpfr_srcptr()); } - -inline int sin_cos(mpreal& s, mpreal& c, const mpreal& v, mp_rnd_t rnd_mode = mpreal::get_default_rnd()) { - return mpfr_sin_cos(s.mpfr_ptr(), c.mpfr_ptr(), v.mpfr_srcptr(), rnd_mode); -} - -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& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(cbrt); -} -inline const mpreal fabs(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(abs); -} -inline const mpreal abs(const mpreal& x, mp_rnd_t r) { MPREAL_UNARY_MATH_FUNCTION_BODY(abs); } -inline const mpreal log(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(log); -} -inline const mpreal log2(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(log2); -} -inline const mpreal log10(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(log10); -} -inline const mpreal exp(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(exp); -} -inline const mpreal exp2(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(exp2); -} -inline const mpreal exp10(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(exp10); -} -inline const mpreal cos(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(cos); -} -inline const mpreal sin(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(sin); -} -inline const mpreal tan(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(tan); -} -inline const mpreal sec(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(sec); -} -inline const mpreal csc(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(csc); -} -inline const mpreal cot(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(cot); -} -inline const mpreal acos(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(acos); -} -inline const mpreal asin(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(asin); -} -inline const mpreal atan(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(atan); -} - -inline const mpreal logb(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { return log2(abs(x), r); } - -inline const mpreal acot(const mpreal& v, mp_rnd_t r = mpreal::get_default_rnd()) { return atan(1 / v, r); } -inline const mpreal asec(const mpreal& v, mp_rnd_t r = mpreal::get_default_rnd()) { return acos(1 / v, r); } -inline const mpreal acsc(const mpreal& v, mp_rnd_t r = mpreal::get_default_rnd()) { return asin(1 / v, r); } -inline const mpreal acoth(const mpreal& v, mp_rnd_t r = mpreal::get_default_rnd()) { return atanh(1 / v, r); } -inline const mpreal asech(const mpreal& v, mp_rnd_t r = mpreal::get_default_rnd()) { return acosh(1 / v, r); } -inline const mpreal acsch(const mpreal& v, mp_rnd_t r = mpreal::get_default_rnd()) { return asinh(1 / v, r); } - -inline const mpreal cosh(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(cosh); -} -inline const mpreal sinh(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(sinh); -} -inline const mpreal tanh(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(tanh); -} -inline const mpreal sech(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(sech); -} -inline const mpreal csch(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(csch); -} -inline const mpreal coth(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(coth); -} -inline const mpreal acosh(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(acosh); -} -inline const mpreal asinh(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(asinh); -} -inline const mpreal atanh(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(atanh); -} - -inline const mpreal log1p(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(log1p); -} -inline const mpreal expm1(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(expm1); -} -inline const mpreal eint(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(eint); -} -inline const mpreal gamma(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(gamma); -} -inline const mpreal tgamma(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(gamma); -} -inline const mpreal lngamma(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(lngamma); -} -inline const mpreal zeta(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(zeta); -} -inline const mpreal erf(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(erf); -} -inline const mpreal erfc(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(erfc); -} -inline const mpreal besselj0(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(j0); -} -inline const mpreal besselj1(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(j1); -} -inline const mpreal bessely0(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(y0); -} -inline const mpreal bessely1(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(y1); -} - -inline const mpreal atan2(const mpreal& y, const mpreal& x, mp_rnd_t rnd_mode = mpreal::get_default_rnd()) { - mpreal a(0, (std::max)(y.getPrecision(), x.getPrecision())); - mpfr_atan2(a.mpfr_ptr(), y.mpfr_srcptr(), x.mpfr_srcptr(), rnd_mode); - return a; -} - -inline const mpreal hypot(const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode = mpreal::get_default_rnd()) { - mpreal a(0, (std::max)(y.getPrecision(), x.getPrecision())); - mpfr_hypot(a.mpfr_ptr(), x.mpfr_srcptr(), y.mpfr_srcptr(), rnd_mode); - return a; -} - -inline const mpreal remainder(const mpreal& x, const mpreal& y, - mp_rnd_t rnd_mode = mpreal::get_default_rnd()) { - mpreal a(0, (std::max)(y.getPrecision(), x.getPrecision())); - mpfr_remainder(a.mpfr_ptr(), x.mpfr_srcptr(), y.mpfr_srcptr(), rnd_mode); - return a; -} - -inline const mpreal remquo(long* q, const mpreal& x, const mpreal& y, - mp_rnd_t rnd_mode = mpreal::get_default_rnd()) { - mpreal a(0, (std::max)(y.getPrecision(), x.getPrecision())); - mpfr_remquo(a.mpfr_ptr(), q, x.mpfr_srcptr(), y.mpfr_srcptr(), rnd_mode); - return a; -} - -inline const mpreal fac_ui(unsigned long int v, mp_prec_t prec = mpreal::get_default_prec(), - mp_rnd_t rnd_mode = mpreal::get_default_rnd()) { - mpreal x(0, prec); - mpfr_fac_ui(x.mpfr_ptr(), v, rnd_mode); - return x; -} - -inline const mpreal lgamma(const mpreal& v, int* signp = 0, mp_rnd_t rnd_mode = mpreal::get_default_rnd()) { - mpreal x(v); - int tsignp; - - if (signp) - mpfr_lgamma(x.mpfr_ptr(), signp, v.mpfr_srcptr(), rnd_mode); - else - mpfr_lgamma(x.mpfr_ptr(), &tsignp, v.mpfr_srcptr(), rnd_mode); - - return x; -} - -inline const mpreal besseljn(long n, const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - mpreal y(0, x.getPrecision()); - mpfr_jn(y.mpfr_ptr(), n, x.mpfr_srcptr(), r); - return y; -} - -inline const mpreal besselyn(long n, const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - mpreal y(0, x.getPrecision()); - mpfr_yn(y.mpfr_ptr(), n, x.mpfr_srcptr(), r); - return y; -} - -inline const mpreal fma(const mpreal& v1, const mpreal& v2, const mpreal& v3, - mp_rnd_t rnd_mode = mpreal::get_default_rnd()) { - mpreal a; - mp_prec_t p1, p2, p3; - - p1 = v1.get_prec(); - p2 = v2.get_prec(); - p3 = v3.get_prec(); - - a.set_prec(p3 > p2 ? (p3 > p1 ? p3 : p1) : (p2 > p1 ? p2 : p1)); - - mpfr_fma(a.mp, v1.mp, v2.mp, v3.mp, rnd_mode); - return a; -} - -inline const mpreal fms(const mpreal& v1, const mpreal& v2, const mpreal& v3, - mp_rnd_t rnd_mode = mpreal::get_default_rnd()) { - mpreal a; - mp_prec_t p1, p2, p3; - - p1 = v1.get_prec(); - p2 = v2.get_prec(); - p3 = v3.get_prec(); - - a.set_prec(p3 > p2 ? (p3 > p1 ? p3 : p1) : (p2 > p1 ? p2 : p1)); - - mpfr_fms(a.mp, v1.mp, v2.mp, v3.mp, rnd_mode); - return a; -} - -inline const mpreal agm(const mpreal& v1, const mpreal& v2, mp_rnd_t rnd_mode = mpreal::get_default_rnd()) { - mpreal a; - mp_prec_t p1, p2; - - p1 = v1.get_prec(); - p2 = v2.get_prec(); - - a.set_prec(p1 > p2 ? p1 : p2); - - mpfr_agm(a.mp, v1.mp, v2.mp, rnd_mode); - - return a; -} - -inline const mpreal sum(const mpreal tab[], const unsigned long int n, int& status, - mp_rnd_t mode = mpreal::get_default_rnd()) { - mpfr_srcptr* p = new mpfr_srcptr[n]; - - for (unsigned long int i = 0; i < n; i++) p[i] = tab[i].mpfr_srcptr(); - - mpreal x; - status = mpfr_sum(x.mpfr_ptr(), (mpfr_ptr*)p, n, mode); - - delete[] p; - 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 = mpreal::get_default_rnd()) { - return mpfr_sinh_cosh(s.mp, c.mp, v.mp, rnd_mode); -} - -inline const mpreal li2(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(li2); -} - -inline const mpreal rem(const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode = mpreal::get_default_rnd()) { - /* R = rem(X,Y) if Y != 0, returns X - n * Y where n = trunc(X/Y). */ - return fmod(x, y, rnd_mode); -} - -inline const mpreal mod(const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode = mpreal::get_default_rnd()) { - (void)rnd_mode; - - /* - - m = mod(x,y) if y != 0, returns x - n*y where n = floor(x/y) - - The following are true by convention: - - mod(x,0) is x - - mod(x,x) is 0 - - mod(x,y) for x != y and y != 0 has the same sign as y. - - */ - - if (iszero(y)) return x; - if (x == y) return 0; - - mpreal m = x - floor(x / y) * y; - - m.setSign(sgn(y)); // make sure result has the same sign as Y - - return m; -} - -inline const mpreal fmod(const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode = mpreal::get_default_rnd()) { - 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::get_default_rnd()) { - 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& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(digamma); -} -inline const mpreal ai(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(ai); -} -#endif // MPFR 3.0.0 Specifics - -////////////////////////////////////////////////////////////////////////// -// Constants -inline const mpreal const_log2(mp_prec_t p = mpreal::get_default_prec(), - mp_rnd_t r = mpreal::get_default_rnd()) { - mpreal x(0, p); - mpfr_const_log2(x.mpfr_ptr(), r); - return x; -} - -inline const mpreal const_pi(mp_prec_t p = mpreal::get_default_prec(), - mp_rnd_t r = mpreal::get_default_rnd()) { - mpreal x(0, p); - mpfr_const_pi(x.mpfr_ptr(), r); - return x; -} - -inline const mpreal const_euler(mp_prec_t p = mpreal::get_default_prec(), - mp_rnd_t r = mpreal::get_default_rnd()) { - mpreal x(0, p); - mpfr_const_euler(x.mpfr_ptr(), r); - return x; -} - -inline const mpreal const_catalan(mp_prec_t p = mpreal::get_default_prec(), - mp_rnd_t r = mpreal::get_default_rnd()) { - mpreal x(0, p); - mpfr_const_catalan(x.mpfr_ptr(), r); - return x; -} - -inline const mpreal const_infinity(int sign = 1, mp_prec_t p = mpreal::get_default_prec()) { - mpreal x(0, p); - mpfr_set_inf(x.mpfr_ptr(), sign); - return x; -} - -////////////////////////////////////////////////////////////////////////// -// Integer Related Functions -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(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(rint); -} -inline const mpreal rint_ceil(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(rint_ceil); -} -inline const mpreal rint_floor(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(rint_floor); -} -inline const mpreal rint_round(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(rint_round); -} -inline const mpreal rint_trunc(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(rint_trunc); -} -inline const mpreal frac(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) { - MPREAL_UNARY_MATH_FUNCTION_BODY(frac); -} - -////////////////////////////////////////////////////////////////////////// -// 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::get_default_rnd()) { - 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::get_default_rnd()) { - 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.mpfr_ptr(), state); - return x; -} - -#if (MPFR_VERSION >= MPFR_VERSION_NUM(3, 0, 0)) -inline const mpreal urandom(gmp_randstate_t& state, mp_rnd_t rnd_mode = mpreal::get_default_rnd()) { - mpreal x; - mpfr_urandom(x.mpfr_ptr(), 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.mpfr_ptr(), size, exp); - return x; -} -#endif - -// 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 = 0) { -#if (MPFR_VERSION >= MPFR_VERSION_NUM(3, 0, 0)) - static gmp_randstate_t state; - static bool initialize = true; - - if (initialize) { - gmp_randinit_default(state); - gmp_randseed_ui(state, 0); - initialize = 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 -} - -#if (MPFR_VERSION >= MPFR_VERSION_NUM(3, 1, 0)) - -inline const mpreal grandom(gmp_randstate_t& state, mp_rnd_t rnd_mode = mpreal::get_default_rnd()) { - mpreal x; - mpfr_nrandom(x.mpfr_ptr(), state, rnd_mode); - return x; -} - -inline const mpreal grandom(unsigned int seed = 0) { - static gmp_randstate_t state; - static bool initialize = true; - - if (initialize) { - gmp_randinit_default(state); - gmp_randseed_ui(state, 0); - initialize = false; - } - - if (seed != 0) gmp_randseed_ui(state, seed); - - return mpfr::grandom(state); -} -#endif - -////////////////////////////////////////////////////////////////////////// -// Set/Get global properties -inline void mpreal::set_default_prec(mp_prec_t prec) { mpfr_set_default_prec(prec); } - -inline void mpreal::set_default_rnd(mp_rnd_t rnd_mode) { mpfr_set_default_rounding_mode(rnd_mode); } - -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::get_default_rnd()) { - 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::get_default_rnd()) { - 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::get_default_rnd()) { - 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(b), rnd_mode); -} - -inline const mpreal pow(const mpreal& a, const long int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd()) { - 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(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::get_default_rnd()) { - 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(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(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(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(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(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(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(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(a), static_cast(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(a), static_cast(b), - rnd_mode); // mpfr_ui_pow_ui - else - return pow(static_cast(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(a), static_cast(b), - rnd_mode); // mpfr_ui_pow_ui - else - return pow(static_cast(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(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(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(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(a), static_cast(b), - rnd_mode); // mpfr_ui_pow_ui - else - return pow(mpreal(a), static_cast(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(a), static_cast(b), - rnd_mode); // mpfr_ui_pow_ui - else - return pow(static_cast(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(a), static_cast(b), - rnd_mode); // mpfr_ui_pow_ui - else - return pow(static_cast(a), mpreal(b), rnd_mode); // mpfr_ui_pow - } else { - return pow(mpreal(a), static_cast(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(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(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(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(a), static_cast(b), - rnd_mode); // mpfr_ui_pow_ui - else - return pow(mpreal(a), static_cast(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(a), static_cast(b), - rnd_mode); // mpfr_ui_pow_ui - else - return pow(static_cast(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(a), static_cast(b), - rnd_mode); // mpfr_ui_pow_ui - else - return pow(static_cast(a), mpreal(b), rnd_mode); // mpfr_ui_pow - } else { - return pow(mpreal(a), static_cast(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(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(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(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(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(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(b), rnd_mode); // mpfr_pow_si -} -} // namespace mpfr - -// 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 { -// we are allowed to extend namespace std with specializations only -template <> -inline void swap(mpfr::mpreal& x, mpfr::mpreal& y) { - return mpfr::swap(x, y); -} - -template <> -class numeric_limits { - public: - static const bool is_specialized = true; - static const bool is_signed = true; - static const bool is_integer = false; - static const bool is_exact = false; - static const int radix = 2; - - static const bool has_infinity = true; - static const bool has_quiet_NaN = true; - static const bool has_signaling_NaN = true; - - static const bool is_iec559 = true; // = IEEE 754 - static const bool is_bounded = true; - static const bool is_modulo = false; - static const bool traps = true; - static const bool tinyness_before = true; - - static const float_denorm_style has_denorm = denorm_absent; - - inline static mpfr::mpreal(min)(mp_prec_t precision = mpfr::mpreal::get_default_prec()) { - return mpfr::minval(precision); - } - inline static mpfr::mpreal(max)(mp_prec_t precision = mpfr::mpreal::get_default_prec()) { - return mpfr::maxval(precision); - } - inline static mpfr::mpreal lowest(mp_prec_t precision = mpfr::mpreal::get_default_prec()) { - return -mpfr::maxval(precision); - } - - // Returns smallest eps such that 1 + eps != 1 (classic machine epsilon) - inline static mpfr::mpreal epsilon(mp_prec_t precision = mpfr::mpreal::get_default_prec()) { - return mpfr::machine_epsilon(precision); - } - - // Returns smallest eps such that x + eps != x (relative machine epsilon) - inline static mpfr::mpreal epsilon(const mpfr::mpreal& x) { return mpfr::machine_epsilon(x); } - - inline static mpfr::mpreal round_error(mp_prec_t precision = mpfr::mpreal::get_default_prec()) { - mp_rnd_t r = mpfr::mpreal::get_default_rnd(); - - if (r == GMP_RNDN) - return mpfr::mpreal(0.5, precision); - else - return mpfr::mpreal(1.0, precision); - } - - inline static const mpfr::mpreal infinity() { return mpfr::const_infinity(); } - inline static const mpfr::mpreal quiet_NaN() { return mpfr::mpreal().setNan(); } - inline static const mpfr::mpreal signaling_NaN() { return mpfr::mpreal().setNan(); } - inline static const mpfr::mpreal denorm_min() { return (min)(); } - - // Please note, exponent range is not fixed in MPFR - static const int min_exponent = MPFR_EMIN_DEFAULT; - static const int max_exponent = MPFR_EMAX_DEFAULT; - MPREAL_PERMISSIVE_EXPR static const int min_exponent10 = (int)(MPFR_EMIN_DEFAULT * 0.3010299956639811); - MPREAL_PERMISSIVE_EXPR static const int max_exponent10 = (int)(MPFR_EMAX_DEFAULT * 0.3010299956639811); - -#ifdef MPREAL_HAVE_DYNAMIC_STD_NUMERIC_LIMITS - - // Following members should be constant according to standard, but they can be variable in MPFR - // So we define them as functions here. - // - // This is preferable way for std::numeric_limits specialization. - // But it is incompatible with standard std::numeric_limits and might not work with other libraries, e.g. - // boost. - // See below for compatible implementation. - inline static float_round_style round_style() { - mp_rnd_t r = mpfr::mpreal::get_default_rnd(); - - switch (r) { - case GMP_RNDN: - return round_to_nearest; - case GMP_RNDZ: - return round_toward_zero; - case GMP_RNDU: - return round_toward_infinity; - case GMP_RNDD: - return round_toward_neg_infinity; - default: - return round_indeterminate; - } - } - - inline static int digits() { return int(mpfr::mpreal::get_default_prec()); } - inline static int digits(const mpfr::mpreal& x) { return x.getPrecision(); } - - inline static int digits10(mp_prec_t precision = mpfr::mpreal::get_default_prec()) { - return mpfr::bits2digits(precision); - } - - inline static int digits10(const mpfr::mpreal& x) { return mpfr::bits2digits(x.getPrecision()); } - - inline static int max_digits10(mp_prec_t precision = mpfr::mpreal::get_default_prec()) { - return digits10(precision); - } -#else - // Digits and round_style are NOT constants when it comes to mpreal. - // If possible, please use functions digits() and round_style() defined above. - // - // These (default) values are preserved for compatibility with existing libraries, e.g. boost. - // Change them accordingly to your application. - // - // For example, if you use 256 bits of precision uniformly in your program, then: - // digits = 256 - // digits10 = 77 - // max_digits10 = 78 - // - // Approximate formula for decimal digits is: digits10 = floor(log10(2) * digits). See bits2digits() for - // more details. - - static const std::float_round_style round_style = round_to_nearest; - static const int digits = 53; - static const int digits10 = 15; - static const int max_digits10 = 16; -#endif -}; -} // namespace std - -#endif /* __MPREAL_H__ */ From af1c2f2a3836733ab21e45251b14f332f0c9c1fa Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Mon, 8 May 2023 12:55:09 +0200 Subject: [PATCH 4/7] attempt to always upload cache --- .github/workflows/validation.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/validation.yml b/.github/workflows/validation.yml index 308fa9594..e68e0c758 100644 --- a/.github/workflows/validation.yml +++ b/.github/workflows/validation.yml @@ -72,6 +72,7 @@ jobs: with: key: ${{ env.BRANCH_NAME }}-${{ github.sha }} path: ${{ env.REST_PATH }} + upload-when-found: true - name: Upload Artifacts uses: actions/upload-artifact@v3 with: From fbd3ffb5dc53077aec362f7de39ed5f682034530 Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Mon, 8 May 2023 13:18:37 +0200 Subject: [PATCH 5/7] use different key name for ref version --- .github/workflows/validation.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/validation.yml b/.github/workflows/validation.yml index e68e0c758..2db23e6a5 100644 --- a/.github/workflows/validation.yml +++ b/.github/workflows/validation.yml @@ -461,10 +461,9 @@ jobs: id: framework-install-cache-reference uses: actions/cache@v3 with: - key: ${{ env.BRANCH_NAME }}-${{ github.sha }} + key: ${{ env.BRANCH_NAME }}-ref-${{ github.sha }} path: ${{ env.REST_PATH }} - pandax-iii-reference: name: "PandaX-III on reference version" runs-on: ubuntu-latest @@ -484,7 +483,7 @@ jobs: uses: actions/cache@v3 id: framework-install-cache-reference with: - key: ${{ env.BRANCH_NAME }}-${{ github.sha }} + key: ${{ env.BRANCH_NAME }}-ref-${{ github.sha }} path: ${{ env.REST_PATH }} - name: 02_PandaXiiiMC run: | @@ -554,7 +553,7 @@ jobs: uses: actions/cache@v3 id: framework-install-cache-reference with: - key: ${{ env.BRANCH_NAME }}-${{ github.sha }} + key: ${{ env.BRANCH_NAME }}-ref-${{ github.sha }} path: ${{ env.REST_PATH }} - name: Test Metadata run: | From 764e7f62603fdbdbbbe03077316f90ae9f45cd2b Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Mon, 8 May 2023 13:19:38 +0200 Subject: [PATCH 6/7] remove bad option --- .github/workflows/validation.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/validation.yml b/.github/workflows/validation.yml index 2db23e6a5..234060d05 100644 --- a/.github/workflows/validation.yml +++ b/.github/workflows/validation.yml @@ -72,7 +72,6 @@ jobs: with: key: ${{ env.BRANCH_NAME }}-${{ github.sha }} path: ${{ env.REST_PATH }} - upload-when-found: true - name: Upload Artifacts uses: actions/upload-artifact@v3 with: From dabd3f76c8e1f568fd5a42e4875cbf58c73be063 Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Mon, 8 May 2023 13:40:03 +0200 Subject: [PATCH 7/7] use more explicit cache key names --- .github/workflows/validation.yml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/validation.yml b/.github/workflows/validation.yml index 234060d05..c46df6351 100644 --- a/.github/workflows/validation.yml +++ b/.github/workflows/validation.yml @@ -70,7 +70,7 @@ jobs: id: framework-install-cache uses: actions/cache@v3 with: - key: ${{ env.BRANCH_NAME }}-${{ github.sha }} + key: ${{ env.BRANCH_NAME }}-framework-${{ github.sha }} path: ${{ env.REST_PATH }} - name: Upload Artifacts uses: actions/upload-artifact@v3 @@ -94,7 +94,7 @@ jobs: uses: actions/cache@v3 id: framework-install-cache with: - key: ${{ env.BRANCH_NAME }}-${{ github.sha }} + key: ${{ env.BRANCH_NAME }}-framework-${{ github.sha }} path: ${{ env.REST_PATH }} - name: Open V2.2 file run: | @@ -117,7 +117,7 @@ jobs: uses: actions/cache@v3 id: framework-install-cache with: - key: ${{ env.BRANCH_NAME }}-${{ github.sha }} + key: ${{ env.BRANCH_NAME }}-framework-${{ github.sha }} path: ${{ env.REST_PATH }} - name: Load restRootMacros run: | @@ -141,7 +141,7 @@ jobs: uses: actions/cache@v3 id: framework-install-cache with: - key: ${{ env.BRANCH_NAME }}-${{ github.sha }} + key: ${{ env.BRANCH_NAME }}-framework-${{ github.sha }} path: ${{ env.REST_PATH }} - name: Test REST classes in PyROOT run: | @@ -167,7 +167,7 @@ jobs: uses: actions/cache@v3 id: framework-install-cache with: - key: ${{ env.BRANCH_NAME }}-${{ github.sha }} + key: ${{ env.BRANCH_NAME }}-framework-${{ github.sha }} path: ${{ env.REST_PATH }} # Not used in gitlab pipeline, checks $CI_SERVER_HOST - name: Load Gas @@ -219,7 +219,7 @@ jobs: uses: actions/cache@v3 id: framework-install-cache with: - key: ${{ env.BRANCH_NAME }}-${{ github.sha }} + key: ${{ env.BRANCH_NAME }}-framework-${{ github.sha }} path: ${{ env.REST_PATH }} - name: 02_PandaXiiiMC run: | @@ -307,7 +307,7 @@ jobs: uses: actions/cache@v3 id: framework-install-cache with: - key: ${{ env.BRANCH_NAME }}-${{ github.sha }} + key: ${{ env.BRANCH_NAME }}-framework-${{ github.sha }} path: ${{ env.REST_PATH }} - name: TREX-DM Latest Data run: | @@ -360,7 +360,7 @@ jobs: uses: actions/cache@v3 id: framework-install-cache with: - key: ${{ env.BRANCH_NAME }}-${{ github.sha }} + key: ${{ env.BRANCH_NAME }}-framework-${{ github.sha }} path: ${{ env.REST_PATH }} - name: Test Metadata run: | @@ -460,7 +460,7 @@ jobs: id: framework-install-cache-reference uses: actions/cache@v3 with: - key: ${{ env.BRANCH_NAME }}-ref-${{ github.sha }} + key: ${{ env.BRANCH_NAME }}-framework-ref-${{ github.sha }} path: ${{ env.REST_PATH }} pandax-iii-reference: @@ -482,7 +482,7 @@ jobs: uses: actions/cache@v3 id: framework-install-cache-reference with: - key: ${{ env.BRANCH_NAME }}-ref-${{ github.sha }} + key: ${{ env.BRANCH_NAME }}-framework-ref-${{ github.sha }} path: ${{ env.REST_PATH }} - name: 02_PandaXiiiMC run: | @@ -552,7 +552,7 @@ jobs: uses: actions/cache@v3 id: framework-install-cache-reference with: - key: ${{ env.BRANCH_NAME }}-ref-${{ github.sha }} + key: ${{ env.BRANCH_NAME }}-framework-ref-${{ github.sha }} path: ${{ env.REST_PATH }} - name: Test Metadata run: |