about summary refs log tree commit diff
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.tar.xz
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