00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef __MMX_MPFR_HPP
00014 #define __MMX_MPFR_HPP
00015 #include <gmp.h>
00016 #include <mpfr.h>
00017 #include <numerix/mmx_gmp.hpp>
00018
00019 namespace mmx {
00020
00021
00022
00023
00024
00025 extern xnat mmx_significant_digits;
00026 extern xnat mmx_bit_precision;
00027 extern xnat mmx_discrepancy;
00028 extern mpfr_rnd_t mmx_rounding_mode;
00029 extern bool mmx_pretty_exponents;
00030
00031 struct mmx_local_significant_digits {
00032 xnat p;
00033 inline mmx_local_significant_digits (xnat p2):
00034 p (mmx_significant_digits) {
00035 mmx_significant_digits= p2; }
00036 inline ~mmx_local_significant_digits () {
00037 mmx_significant_digits= p; }
00038 };
00039
00040 struct mmx_local_bit_precision {
00041 xnat p;
00042 inline mmx_local_bit_precision (xnat p2):
00043 p (mmx_bit_precision) {
00044 mmx_bit_precision= p2; }
00045 inline ~mmx_local_bit_precision () {
00046 mmx_bit_precision= p; }
00047 };
00048
00049
00050
00051
00052
00053 class string;
00054 extern string mpfr_to_string (const mpz_t x);
00055 extern string mpfr_to_string (const mpfr_t x, xnat bits= 0);
00056 extern string zero_to_string (const mpfr_t err);
00057
00058 inline xnat mpfr_prec_round_up (xnat prec) {
00059 return BITS_PER_LIMB * ((prec + BITS_PER_LIMB - 1) / BITS_PER_LIMB); }
00060 inline mp_exp_t mpfr_get_step (const mpfr_t arg) {
00061 return mpfr_get_exp (arg) - mpfr_get_prec (arg); }
00062 inline mp_exp_t mpfr_safe_get_step (const mpfr_t arg) {
00063 if (mpfr_sgn (arg) == 0) return mpfr_get_emin ();
00064 else return mpfr_get_exp (arg) - mpfr_get_prec (arg); }
00065 inline mp_exp_t mpfr_safe_get_exp (const mpfr_t arg) {
00066 if (mpfr_sgn (arg) == 0) return mpfr_get_emin ();
00067 else return mpfr_get_exp (arg); }
00068 double mpfr_get_magnitude (const mpfr_t arg);
00069
00070 void mpfr_binary_write (const port& p, const mpfr_t arg);
00071 void mpfr_binary_read (const port& p, mpfr_t dest);
00072
00073 }
00074 #endif // __MMX_MPFR_HPP