zsh-workers
 help / color / mirror / code / Atom feed
* PATCH: 3.1.6-pws-4: floating point support
@ 1999-09-17 12:23 Peter Stephenson
  1999-09-18 18:21 ` Bart Schaefer
  0 siblings, 1 reply; 6+ messages in thread
From: Peter Stephenson @ 1999-09-17 12:23 UTC (permalink / raw)
  To: Zsh hackers list

Here's my first go at floating point support.

It tries to follow ksh93: there are typeset -F and typeset -E type floats,
both actually doubles internally, differing only in the way they are output
(with %f and %e, not surprisingly), and a float builtin (in ksh this was an
alias, but this is a standard difference between ksh and zsh applying to
other aliased builtins too).  Since I'm only going by the manual page,
there could be many other differences.

For other user-visible features, see the manual, but the highlights are:
promotion from integer to floating point is broadly how you would expect;
operators requiring integers silently truncate floating point values (like
perl, but unlike C --- please don't use phrases like `strongly typed'
around here); output via $((...)) instead of individual variables uses %g
with about the largest sensible number of sig figs; undeclared variables
used in math evals are typed by their first assignment (this just extends
the existing behaviour for integers, but there's a gotcha here, see the
manual); scalars used as numbers do not remember their type, e.g.
`f=0; (( f += 0.5 ))' will assign f as a scalar, convert it's value to an
integer, promote that to a float for the addition, then assign back to f as
a float.

Outside an immediate numeric context, such as a $((...)) or a normal array
subscript, there is no special way of telling whether an integer or float
is required.  So if you need an integer but use a float, the decimal point
is liable to get in the way.  But that's inevitable.

Internals: math numbers are passed around as an mnumber.  Unlike most other
structures, this is passed around bodily, not by pointer:  it's only a
union for the number, plus an int for the type, and it's convenient to
be able to treat it like other numeric types.

I've adapted mem.c to align to doubles regardless of the largest integer
type in use.  Unfortunately this hasn't been tested properly, since
--enable-zsh-mem doesn't work here:  it needs trying out with both that
and --disable-lfs which uses 32 bit integers and hence requires some extra
padding.  I'll try to remember to test this next time I compile on a
machine where this works.

begin 0 float.dif.gz
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
17HWB-47&B_\!65@Y(]O6``!C
`
end

-- 
Peter Stephenson <pws@ibmth.df.unipi.it>       Tel: +39 050 844536
WWW:  http://www.ifh.de/~pws/
Dipartimento di Fisica, Via Buonarroti 2, 56127 Pisa, Italy


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: PATCH: 3.1.6-pws-4: floating point support
  1999-09-17 12:23 PATCH: 3.1.6-pws-4: floating point support Peter Stephenson
@ 1999-09-18 18:21 ` Bart Schaefer
  1999-09-20  9:14   ` Peter Stephenson
  0 siblings, 1 reply; 6+ messages in thread
From: Bart Schaefer @ 1999-09-18 18:21 UTC (permalink / raw)
  To: Zsh hackers list

On Sep 17,  2:23pm, Peter Stephenson wrote:
} Subject: PATCH: 3.1.6-pws-4: floating point support
}
} Here's my first go at floating point support.
} 
} Outside an immediate numeric context, such as a $((...)) or a normal array
} subscript, there is no special way of telling whether an integer or float
} is required.  So if you need an integer but use a float, the decimal point
} is liable to get in the way.  But that's inevitable.

What's the most appropriate idiom for forcing a floating point number to be
interpreted as an integer, e.g. to force integer division?

The thing that bothers me most -- and I don't know what if anything ksh does
about this, so maybe it's moot -- is that

	((x=y))

where y is float and x was not previously defined, creates x as float, which
may be unexpected (if the assignment is in code that's held over from pre-
float zsh).  This is similar to, but more subtle than, the for-((...))-loop
problem that appears as an example in the doc.  Being required to predeclare
variables with "integer" or "float" from outside the ((...)) context feels
a bit clumsy to me, so I hope there's a better way.

While doing some random fooling around with this, I noticed:

zagzig<23> ((integer florp=9.2))
zsh: bad math expression: unbalanced stack
zagzig<24> typeset -F
florp=9.2000000000

The variable got assigned in spite of the syntax error?  Ouch.

Finally, there's a typo in the doc.

Index: Doc/Zsh/builtins.yo
===================================================================
@@ -348,7 +348,7 @@
 If no var(job) is specified, resume the current job.
 )
 findex(float)
-item(tt(float) [ {tt(PLUE())|tt(-)}tt(EFghlrtux) ] [ var(name)[tt(=)var(value)] ... ])(
+item(tt(float) [ {tt(PLUS())|tt(-)}tt(EFghlrtux) ] [ var(name)[tt(=)var(value)] ... ])(
 Equivalent to tt(typeset -E), except that options irrelevant to floating
 point numbers are not permitted.
 )

-- 
Bart Schaefer                                 Brass Lantern Enterprises
http://www.well.com/user/barts              http://www.brasslantern.com


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: PATCH: 3.1.6-pws-4: floating point support
  1999-09-18 18:21 ` Bart Schaefer
@ 1999-09-20  9:14   ` Peter Stephenson
  1999-09-20 16:14     ` Peter Stephenson
  0 siblings, 1 reply; 6+ messages in thread
From: Peter Stephenson @ 1999-09-20  9:14 UTC (permalink / raw)
  To: Zsh hackers list

"Bart Schaefer" wrote:
> What's the most appropriate idiom for forcing a floating point number to be
> interpreted as an integer, e.g. to force integer division?
> 
> The thing that bothers me most -- and I don't know what if anything ksh does
> about this, so maybe it's moot -- is that
> 
> 	((x=y))
> 
> where y is float and x was not previously defined, creates x as float, which
> may be unexpected (if the assignment is in code that's held over from pre-
> float zsh).

Well, if y is a float but holds an integer you can get away with

(( x = $(( y )) ))

because the %g format used for outputting with $(( y )) doesn't use the
decimal point unless it's necessary.  But there's no mechanism for a cast
other than making sure your parameters are declared appropriately.

> While doing some random fooling around with this, I noticed:
> 
> zagzig<23> ((integer florp=9.2))
> zsh: bad math expression: unbalanced stack
> zagzig<24> typeset -F
> florp=9.2000000000
> 
> The variable got assigned in spite of the syntax error?  Ouch.

The math parser is rather a hack; there's never been any proper syntax
checking, which is why you always get that meaningless (to the user) error
message.  What happens here is that `integer' gets put on the stack as a
parameter, then so does florp.  Then when = is found, its right hand side
is evaluated and the operator called.  At that point, that operation is
finished, so the parser goes back and finds it's now got `parameter value'
on the stack with no operator.

I'll see if I can think of something.

-- 
Peter Stephenson <pws@ibmth.df.unipi.it>       Tel: +39 050 844536
WWW:  http://www.ifh.de/~pws/
Dipartimento di Fisica, Via Buonarroti 2, 56127 Pisa, Italy


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: PATCH: 3.1.6-pws-4: floating point support
  1999-09-20  9:14   ` Peter Stephenson
@ 1999-09-20 16:14     ` Peter Stephenson
  0 siblings, 0 replies; 6+ messages in thread
From: Peter Stephenson @ 1999-09-20 16:14 UTC (permalink / raw)
  To: Zsh hackers list

Peter Stephenson wrote:
> > While doing some random fooling around with this, I noticed:
> > 
> > zagzig<23> ((integer florp=9.2))
> > zsh: bad math expression: unbalanced stack
> > zagzig<24> typeset -F
> > florp=9.2000000000
> > 
> > The variable got assigned in spite of the syntax error?  Ouch.
> 
> The math parser is rather a hack; there's never been any proper syntax
> checking, which is why you always get that meaningless (to the user) error
> message.  What happens here is that `integer' gets put on the stack as a
> parameter, then so does florp.  Then when = is found, its right hand side
> is evaluated and the operator called.  At that point, that operation is
> finished, so the parser goes back and finds it's now got `parameter value'
> on the stack with no operator.
> 
> I'll see if I can think of something.

OK, this does some better checking.  It now knows if it should have an
operator or an operand next, so the error is picked up before the
assignment.  However, evaluation and parsing are still done together, so an
error later than the assignment would not stop it.

I improved the error message; as far as I can see, we can say farewell to
unbalanced stacks, but if anyone can get the shell to produce the old
message somehow or other, I'd like to hear about it.

Another change is that $(( ... )) no longer passes the inner pair of
parentheses down to matheval.  I can't see a good reason for that; ((
... )) doesn't do that, and it adds an extra recursive call, so it's best
avoided.  This makes the error messages at the end of parsing consistent,
e.g.

% (( foo = 1 + ))
zsh: bad math expression: operand expected at `'

although maybe there's a better way of saying end of input.

It goes without saying that I haven't tried every possible math expression
with the new code, so if anyone has some really hairy evaluations they
could test it.  Yes, we still need a test suite for the entire shell.

--- Src/math.c.m2	Fri Sep 17 13:28:39 1999
+++ Src/math.c	Mon Sep 20 17:46:15 1999
@@ -57,24 +57,37 @@
  * RL = right-to-left associativity *
  * BOOL = short-circuiting boolean   */
 
-#define LR 0
-#define RL 1
-#define BOOL 2
+#define LR   0x0000
+#define RL   0x0001
+#define BOOL 0x0002
 
 #define MTYPE(x)  ((x) & 3)
 
 /*
- * OP_A2 2 argument
- * OP_A2IR 2 argument with return type integer
- * OP_A2IO 2 arguments, must be integer, returning integer
- * OP_E2 2 argument with assignment
- * OP_E2IO 2 arguments with assignment, must be integer, return integer
+ * OP_A2    2 arguments
+ * OP_A2IR  2 arguments, return integer
+ * OP_A2IO  2 arguments, must be integer, return integer
+ * OP_E2    2 arguments with assignment
+ * OP_E2IO  2 arguments with assignment, must be integer, return integer
+ * OP_OP    None of the above, but occurs where we are expecting an operator
+ *          rather than an operand.
+ * OP_OPF   Followed by an operator, not an operand.
+ *
+ * OP_A2*, OP_E2*, OP_OP*:
+ *   Occur when we need an operator; the next object must be an operand,
+ *   unless OP_OPF is also supplied.
+ *
+ * Others:
+ *   Occur when we need an operand; the next object must also be an operand,
+ *   unless OP_OPF is also supplied.
  */
-#define OP_A2   4
-#define OP_A2IR 8
-#define OP_A2IO 16
-#define OP_E2   32
-#define OP_E2IO 64
+#define OP_A2   0x0004
+#define OP_A2IR 0x0008
+#define OP_A2IO 0x0010
+#define OP_E2   0x0020
+#define OP_E2IO 0x0040
+#define OP_OP   0x0080
+#define OP_OPF  0x0100
 
 #define M_INPAR 0
 #define M_OUTPAR 1
@@ -152,17 +165,17 @@
 
 static int type[TOKCOUNT] =
 {
-/*  0 */    LR, LR, RL, RL, RL,
-/*  5 */    RL, RL, RL, LR|OP_A2IO, LR|OP_A2IO,
-/* 10 */    LR|OP_A2IO, LR|OP_A2, LR|OP_A2, LR|OP_A2IO, LR|OP_A2,
-/* 15 */    LR|OP_A2, LR|OP_A2IO, LR|OP_A2IO, LR|OP_A2IR, LR|OP_A2IR,
-/* 20 */    LR|OP_A2IR, LR|OP_A2IR, LR|OP_A2IR, LR|OP_A2IR, BOOL|OP_A2IO,
-/* 25 */    BOOL|OP_A2IO, LR|OP_A2IO, RL, RL, RL|OP_E2,
-/* 30 */    RL|OP_E2, RL|OP_E2, RL|OP_E2, RL|OP_E2, RL|OP_E2IO,
-/* 35 */    RL|OP_E2IO, RL|OP_E2IO, RL|OP_E2IO, RL|OP_E2IO, RL|OP_E2IO,
-/* 40 */    BOOL|OP_E2IO, BOOL|OP_E2IO, RL|OP_A2IO, RL|OP_A2, RL,
-/* 45 */    RL, RL, LR, LR, RL|OP_A2,
-/* 50 */    LR, RL|OP_E2
+/*  0 */  LR, LR|OP_OP|OP_OPF, RL, RL, RL|OP_OP|OP_OPF,
+/*  5 */  RL|OP_OP|OP_OPF, RL, RL, LR|OP_A2IO, LR|OP_A2IO,
+/* 10 */  LR|OP_A2IO, LR|OP_A2, LR|OP_A2, LR|OP_A2IO, LR|OP_A2,
+/* 15 */  LR|OP_A2, LR|OP_A2IO, LR|OP_A2IO, LR|OP_A2IR, LR|OP_A2IR,
+/* 20 */  LR|OP_A2IR, LR|OP_A2IR, LR|OP_A2IR, LR|OP_A2IR, BOOL|OP_A2IO,
+/* 25 */  BOOL|OP_A2IO, LR|OP_A2IO, RL|OP_OP, RL|OP_OP, RL|OP_E2,
+/* 30 */  RL|OP_E2, RL|OP_E2, RL|OP_E2, RL|OP_E2, RL|OP_E2IO,
+/* 35 */  RL|OP_E2IO, RL|OP_E2IO, RL|OP_E2IO, RL|OP_E2IO, RL|OP_E2IO,
+/* 40 */  BOOL|OP_E2IO, BOOL|OP_E2IO, RL|OP_A2IO, RL|OP_A2, RL|OP_OP,
+/* 45 */  RL, RL, LR|OP_OPF, LR|OP_OPF, RL|OP_A2,
+/* 50 */  LR|OP_OPF, RL|OP_E2
 };
 
 #define LVCOUNT 32
@@ -188,7 +201,6 @@
 		return (unary) ? PREPLUS : POSTPLUS;
 	    }
 	    if (*ptr == '=') {
-		unary = 1;
 		ptr++;
 		return PLUSEQ;
 	    }
@@ -199,19 +211,16 @@
 		return (unary) ? PREMINUS : POSTMINUS;
 	    }
 	    if (*ptr == '=') {
-		unary = 1;
 		ptr++;
 		return MINUSEQ;
 	    }
 	    return (unary) ? UMINUS : MINUS;
 	case '(':
-	    unary = 1;
 	    return M_INPAR;
 	case ')':
 	    return M_OUTPAR;
 	case '!':
 	    if (*ptr == '=') {
-		unary = 1;
 		ptr++;
 		return NEQ;
 	    }
@@ -219,7 +228,6 @@
 	case '~':
 	    return COMP;
 	case '&':
-	    unary = 1;
 	    if (*ptr == '&') {
 		if (*++ptr == '=') {
 		    ptr++;
@@ -232,7 +240,6 @@
 	    }
 	    return AND;
 	case '|':
-	    unary = 1;
 	    if (*ptr == '|') {
 		if (*++ptr == '=') {
 		    ptr++;
@@ -245,7 +252,6 @@
 	    }
 	    return OR;
 	case '^':
-	    unary = 1;
 	    if (*ptr == '^') {
 		if (*++ptr == '=') {
 		    ptr++;
@@ -258,7 +264,6 @@
 	    }
 	    return XOR;
 	case '*':
-	    unary = 1;
 	    if (*ptr == '*') {
 		if (*++ptr == '=') {
 		    ptr++;
@@ -272,21 +277,18 @@
 	    }
 	    return MUL;
 	case '/':
-	    unary = 1;
 	    if (*ptr == '=') {
 		ptr++;
 		return DIVEQ;
 	    }
 	    return DIV;
 	case '%':
-	    unary = 1;
 	    if (*ptr == '=') {
 		ptr++;
 		return MODEQ;
 	    }
 	    return MOD;
 	case '<':
-	    unary = 1;
 	    if (*ptr == '<') {
 		if (*++ptr == '=') {
 		    ptr++;
@@ -299,7 +301,6 @@
 	    }
 	    return LES;
 	case '>':
-	    unary = 1;
 	    if (*ptr == '>') {
 		if (*++ptr == '=') {
 		    ptr++;
@@ -312,14 +313,12 @@
 	    }
 	    return GRE;
 	case '=':
-	    unary = 1;
 	    if (*ptr == '=') {
 		ptr++;
 		return DEQ;
 	    }
 	    return EQ;
 	case '$':
-	    unary = 0;
 	    yyval.u.l = mypid;
 	    return NUM;
 	case '?':
@@ -328,20 +327,15 @@
 		unary = 0;
 		return NUM;
 	    }
-	    unary = 1;
 	    return QUEST;
 	case ':':
-	    unary = 1;
 	    return COLON;
 	case ',':
-	    unary = 1;
 	    return COMMA;
 	case '\0':
-	    unary = 1;
 	    ptr--;
 	    return EOI;
 	case '[':
-	    unary = 0;
 	    {
 		int base = zstrtol(ptr, &ptr, 10);
 
@@ -356,7 +350,6 @@
 	    break;
 	case '0':
 	    if (*ptr == 'x' || *ptr == 'X') {
-		unary = 0;
 		/* Should we set lastbase here? */
 		yyval.u.l = zstrtol(++ptr, &ptr, lastbase = 16);
 		return NUM;
@@ -365,7 +358,6 @@
 	default:
 	    if (idigit(*--ptr) || *ptr == '.') {
 		char *nptr;
-		unary = 0;
 		for (nptr = ptr; idigit(*nptr); nptr++);
 
 		if (*nptr == '.' || *nptr == 'e' || *nptr == 'E') {
@@ -395,7 +387,6 @@
 		    ptr++;
 		    ptr = getkeystring(ptr, NULL, 6, &v);
 		    yyval.u.l = v;
-		    unary = 0;
 		    return NUM;
 		}
 		cct = 1;
@@ -408,7 +399,6 @@
 		    zerr("too many identifiers (complain to author)", NULL, 0);
 		    return EOI;
 		}
-		unary = 0;
 		while (iident(*++ptr));
 		if (*ptr == '[') {
 		    int l;
@@ -429,7 +419,6 @@
 	    }
 	    else if (cct) {
 		yyval.u.l = poundgetfn(NULL);
-		unary = 0;
 		return NUM;
 	    }
 	    return EOI;
@@ -515,6 +504,8 @@
     LV lv;
     int tp = type[what];
 
+    if (errflag)
+	return;
     if (sp < 0) {
 	zerr("bad math expression: stack empty", NULL, 0);
 	return;
@@ -904,6 +895,40 @@
     return (x.type & MN_FLOAT) ? (zlong)x.u.d : x.u.l;
 }
 
+/*
+ * Make sure we have an operator or an operand, whatever is expected.
+ * For this purpose, unary operators constitute part of an operand.
+ */
+
+/**/
+static void
+checkunary(int tp, char *ptr)
+{
+    int errmsg = 0;
+    if (tp & (OP_A2|OP_A2IR|OP_A2IO|OP_E2|OP_E2IO|OP_OP)) {
+	if (unary)
+	    errmsg = 1;
+    } else {
+	if (!unary)
+	    errmsg = 2;
+    }
+    if (errmsg) {
+	char errbuf[40];
+	int len, over = 0;
+	while (inblank(*ptr))
+	    ptr++;
+	len = strlen(ptr);
+	if (len > 10) {
+	    len = 10;
+	    over = 1;
+	}
+	sprintf(errbuf, "bad math expression: %s expected at `%%l%s'",
+		errmsg == 2 ? "operator" : "operand",
+		over ? "..." : ""); 
+	zerr(errbuf, ptr, len);
+    }
+    unary = !(tp & OP_OPF);
+}
 
 /* operator-precedence parse the string and execute */
 
@@ -913,10 +938,12 @@
 {
     zlong q;
     int otok, onoeval;
+    char *optr = ptr;
 
     if (errflag)
 	return;
     mtok = zzlex();
+    checkunary(type[mtok], optr);
     while (prec[mtok] <= pc) {
 	if (errflag)
 	    return;
@@ -964,6 +991,8 @@
 	    op(otok);
 	    continue;
 	}
+	optr = ptr;
 	mtok = zzlex();
+	checkunary(type[mtok], optr);
     }
 }
--- Src/subst.c.m2	Mon Sep 20 13:45:24 1999
+++ Src/subst.c	Mon Sep 20 18:01:23 1999
@@ -152,7 +152,8 @@
 	    *str++ = '\0';
 	    if (endchar == Outpar && str2[1] == '(' && str[-2] == ')') {
 		/* Math substitution of the form $((...)) */
-		str = arithsubst(str2 + 1, &str3, str);
+		str[-2] = '\0';
+		str = arithsubst(str2 + 2, &str3, str);
 		setdata(node, (void *) str3);
 		continue;
 	    }

-- 
Peter Stephenson <pws@ibmth.df.unipi.it>       Tel: +39 050 844536
WWW:  http://www.ifh.de/~pws/
Dipartimento di Fisica, Via Buonarroti 2, 56127 Pisa, Italy


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: PATCH: 3.1.6-pws-4: floating point support
@ 1999-09-17 13:18 Sven Wischnowsky
  1999-09-17 12:51 ` Peter Stephenson
  0 siblings, 1 reply; 6+ messages in thread
From: Sven Wischnowsky @ 1999-09-17 13:18 UTC (permalink / raw)
  To: zsh-workers


Peter Stephenson wrote:

> Here's my first go at floating point support.

I need this change.

Bye
 Sven

--- os/loop.c	Fri Sep 17 15:05:05 1999
+++ Src/loop.c	Fri Sep 17 15:11:27 1999
@@ -92,7 +92,7 @@
 			fprintf(stderr, "%s\n", str);
 			fflush(stderr);
 		    }
-		    val = matheval(str);
+		    val = mathevali(str);
 		} else
 		    val = 1;
 	    }

--
Sven Wischnowsky                         wischnow@informatik.hu-berlin.de


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: PATCH: 3.1.6-pws-4: floating point support
  1999-09-17 13:18 Sven Wischnowsky
@ 1999-09-17 12:51 ` Peter Stephenson
  0 siblings, 0 replies; 6+ messages in thread
From: Peter Stephenson @ 1999-09-17 12:51 UTC (permalink / raw)
  To: zsh-workers

Sven Wischnowsky wrote:
> I need this change.
> -		    val = matheval(str);
> +		    val = mathevali(str);

sorry, I forgot the diffs for loop.c.

At least I didn't forget -lm the first time --- I did the other trick of
forgetting #include <math.h>.  But it works now.

-- 
Peter Stephenson <pws@ibmth.df.unipi.it>       Tel: +39 050 844536
WWW:  http://www.ifh.de/~pws/
Dipartimento di Fisica, Via Buonarroti 2, 56127 Pisa, Italy


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~1999-09-20 16:50 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
1999-09-17 12:23 PATCH: 3.1.6-pws-4: floating point support Peter Stephenson
1999-09-18 18:21 ` Bart Schaefer
1999-09-20  9:14   ` Peter Stephenson
1999-09-20 16:14     ` Peter Stephenson
1999-09-17 13:18 Sven Wischnowsky
1999-09-17 12:51 ` Peter Stephenson

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).