diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2014-01-19 21:37:01 +0200 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2014-01-19 21:37:01 +0200 |
commit | 331e16c39a9658f67085b28e656417ee9d3b4b22 (patch) | |
tree | 8bcceb824bb19165532579af6057584a3d521a4c /awkgram.c | |
parent | 4af359f9e6fb5030bdc1174c707b1728f029d7cf (diff) | |
parent | 20ca1d1ba6e46f116e2dc169d263fd548b9bd074 (diff) | |
download | egawk-331e16c39a9658f67085b28e656417ee9d3b4b22.tar.gz egawk-331e16c39a9658f67085b28e656417ee9d3b4b22.tar.bz2 egawk-331e16c39a9658f67085b28e656417ee9d3b4b22.zip |
Merge branch 'gawk-4.1-stable'
Diffstat (limited to 'awkgram.c')
-rw-r--r-- | awkgram.c | 31 |
1 files changed, 24 insertions, 7 deletions
@@ -4512,16 +4512,33 @@ getfname(NODE *(*fptr)(int)) void negate_num(NODE *n) { + int tval = 0; + + if (! is_mpg_number(n)) + n->numbr = -n->numbr; #ifdef HAVE_MPFR - if (is_mpg_float(n)) { - int tval; - tval = mpfr_neg(n->mpg_numbr, n->mpg_numbr, ROUND_MODE); + else if (is_mpg_integer(n)) { + if (! iszero(n)) { + mpz_neg(n->mpg_i, n->mpg_i); + return; + } + + /* + * 0 --> -0 conversion. Requires turning the MPG integer + * into an MPFR float. + * + * So, convert and fall through. + */ + tval = mpfr_set_d(n->mpg_numbr, 0.0, ROUND_MODE); IEEE_FMT(n->mpg_numbr, tval); - } else if (is_mpg_integer(n)) { - mpz_neg(n->mpg_i, n->mpg_i); - } else + n->flags &= ~MPZN; + n->flags |= MPFN; + } + + /* mpfr float case */ + tval = mpfr_neg(n->mpg_numbr, n->mpg_numbr, ROUND_MODE); + IEEE_FMT(n->mpg_numbr, tval); #endif - n->numbr = -n->numbr; } /* print_included_from --- print `Included from ..' file names and locations */ |