summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Stephenson <pws@zsh.org>2015-01-15 13:52:08 +0000
committerPeter Stephenson <pws@zsh.org>2015-01-15 13:52:40 +0000
commit3a99ef322dafcd2cf833b2a0668436ac120df1b3 (patch)
tree1572509835aab319e5f89ed239d12a3d19518a25
parentc7aa6443907ddd97b6b1e8729ce9c897de0d244c (diff)
downloadzsh-3a99ef322dafcd2cf833b2a0668436ac120df1b3.tar.gz
zsh-3a99ef322dafcd2cf833b2a0668436ac120df1b3.zip
34280: more widespread use of FORCE_FLOAT.
Add the case of variables read for use in arithmetic expressions.
-rw-r--r--ChangeLog4
-rw-r--r--Doc/Zsh/options.yo7
-rw-r--r--Src/math.c13
-rw-r--r--Test/C01arith.ztst10
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