diff options
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | Doc/Zsh/options.yo | 7 | ||||
-rw-r--r-- | Src/math.c | 13 | ||||
-rw-r--r-- | Test/C01arith.ztst | 10 |
4 files changed, 30 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog index ce150381b..1da768569 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2015-01-15 Peter Stephenson <p.stephenson@samsung.com> + * 34280: Doc/Zsh/options.yo, Src/math.c, Test/C01arith.ztst: + make FORCE_FLOAT option also cover variables when read for + use in arithmetic expressions. + * 34287 (see 34286 from Markus Trippelsdorf): Src/zsh.mdd: use -E argument for generating signal names if gcc is preprocessor. diff --git a/Doc/Zsh/options.yo b/Doc/Zsh/options.yo index 076aaf44f..8a0222cfd 100644 --- a/Doc/Zsh/options.yo +++ b/Doc/Zsh/options.yo @@ -496,9 +496,10 @@ pindex(NOFORCEFLOAT) cindex(floating point, forcing use of) cindex(forcing use of floating point) item(tt(FORCE_FLOAT))( -Constants in arithmetic evaluation will be treated as floating point -even without the use of a decimal point. Integers in any base -will be converted. +Constants in arithmetic evaluation will be treated as +floating point even without the use of a decimal point; the +values of integer variables will be converted to floating point when +used in arithmetic expressions. Integers in any base will be converted. ) pindex(GLOB) pindex(NO_GLOB) diff --git a/Src/math.c b/Src/math.c index db42d0f7c..c047725c5 100644 --- a/Src/math.c +++ b/Src/math.c @@ -336,16 +336,27 @@ enum prec_type { static mnumber getmathparam(struct mathvalue *mptr) { + mnumber result; if (!mptr->pval) { char *s = mptr->lval; mptr->pval = (Value)zhalloc(sizeof(struct value)); if (!getvalue(mptr->pval, &s, 1)) { mptr->pval = NULL; + if (isset(FORCEFLOAT)) { + result.type = MN_FLOAT; + result.u.d = 0.0; + return result; + } return zero_mnumber; } } - return getnumvalue(mptr->pval); + result = getnumvalue(mptr->pval); + if (isset(FORCEFLOAT) && result.type == MN_INTEGER) { + result.type = MN_FLOAT; + result.u.d = (double)result.u.l; + } + return result; } static mnumber diff --git a/Test/C01arith.ztst b/Test/C01arith.ztst index 8e0730d8d..ea87af257 100644 --- a/Test/C01arith.ztst +++ b/Test/C01arith.ztst @@ -308,3 +308,13 @@ >2 >2 # It's hard to test for integer to float. + + integer ff1=3 ff2=4 + print $(( ff1/ff2 )) + setopt force_float + print $(( ff1/ff2 )) + unsetopt force_float +0:Variables are forced to floating point where necessary +# 0.75 is exactly representable, don't expect rounding error. +>0 +>0.75 |