diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2017-01-25 19:50:10 +0200 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2017-01-25 19:50:10 +0200 |
commit | 4c19bff0e44c358deb8efacf2cda0dbaf4a45823 (patch) | |
tree | 420dfcbd448b608644218be9463456d479a4a0e6 /awk.h | |
parent | a703fd5dc965f2ba253d07ca94771098d5db974e (diff) | |
parent | 2da83e944e432692f5576ce4baa9831dce13eb77 (diff) | |
download | egawk-4c19bff0e44c358deb8efacf2cda0dbaf4a45823.tar.gz egawk-4c19bff0e44c358deb8efacf2cda0dbaf4a45823.tar.bz2 egawk-4c19bff0e44c358deb8efacf2cda0dbaf4a45823.zip |
Merge branch 'master' of ssh://git.sv.gnu.org/srv/git/gawk
Diffstat (limited to 'awk.h')
-rw-r--r-- | awk.h | 43 |
1 files changed, 27 insertions, 16 deletions
@@ -1251,23 +1251,34 @@ DEREF(NODE *r) /* ------------------------- Pseudo-functions ------------------------- */ #ifdef HAVE_MPFR + +#if 0 + +/* + * In principle, there is no need to have both the MPFN and MPZN flags, + * since we are using 2 bits to encode 1 bit of information. But + * there may be some minor performance advantages from testing only the + * node flag bits without needing also to access the global do_mpfr flag bit. + */ +#define numtype_choose(n, mpfrval, mpzval, dblval) \ + (!do_mpfr ? (dblval) : (((n)->flags & MPFN) ? (mpfrval) : (mpzval))) + +#endif + +/* N.B. This implementation seems to give the fastest results. */ +#define numtype_choose(n, mpfrval, mpzval, dblval) \ + (!((n)->flags & (MPFN|MPZN)) ? (dblval) : (((n)->flags & MPFN) ? (mpfrval) : (mpzval))) + /* conversion to C types */ -#define get_number_ui(n) (((n)->flags & MPFN) ? mpfr_get_ui((n)->mpg_numbr, ROUND_MODE) \ - : ((n)->flags & MPZN) ? mpz_get_ui((n)->mpg_i) \ - : (unsigned long) (n)->numbr) -#define get_number_si(n) (((n)->flags & MPFN) ? mpfr_get_si((n)->mpg_numbr, ROUND_MODE) \ - : ((n)->flags & MPZN) ? mpz_get_si((n)->mpg_i) \ - : (long) (n)->numbr) -#define get_number_d(n) (((n)->flags & MPFN) ? mpfr_get_d((n)->mpg_numbr, ROUND_MODE) \ - : ((n)->flags & MPZN) ? mpz_get_d((n)->mpg_i) \ - : (double) (n)->numbr) -#define get_number_uj(n) (((n)->flags & MPFN) ? mpfr_get_uj((n)->mpg_numbr, ROUND_MODE) \ - : ((n)->flags & MPZN) ? (uintmax_t) mpz_get_d((n)->mpg_i) \ - : (uintmax_t) (n)->numbr) - -#define iszero(n) (((n)->flags & MPFN) ? mpfr_zero_p((n)->mpg_numbr) \ - : ((n)->flags & MPZN) ? (mpz_sgn((n)->mpg_i) == 0) \ - : ((n)->numbr == 0.0)) +#define get_number_ui(n) numtype_choose((n), mpfr_get_ui((n)->mpg_numbr, ROUND_MODE), mpz_get_ui((n)->mpg_i), (unsigned long) (n)->numbr) + +#define get_number_si(n) numtype_choose((n), mpfr_get_si((n)->mpg_numbr, ROUND_MODE), mpz_get_si((n)->mpg_i), (long) (n)->numbr) + +#define get_number_d(n) numtype_choose((n), mpfr_get_d((n)->mpg_numbr, ROUND_MODE), mpz_get_d((n)->mpg_i), (double) (n)->numbr) + +#define get_number_uj(n) numtype_choose((n), mpfr_get_uj((n)->mpg_numbr, ROUND_MODE), (uintmax_t) mpz_get_d((n)->mpg_i), (uintmax_t) (n)->numbr) + +#define iszero(n) numtype_choose((n), mpfr_zero_p((n)->mpg_numbr), (mpz_sgn((n)->mpg_i) == 0), ((n)->numbr == 0.0)) #define IEEE_FMT(r, t) (void) (do_ieee_fmt && format_ieee(r, t)) |