* Re: Strange division using mixed integers and floats
2004-04-28 11:05 ` David Kastrup
@ 2004-04-28 13:20 ` Lars Brinkhoff
2004-04-28 14:02 ` Andreas Schwab
2004-04-29 13:31 ` Richard Stallman
2 siblings, 0 replies; 7+ messages in thread
From: Lars Brinkhoff @ 2004-04-28 13:20 UTC (permalink / raw)
David Kastrup <dak@gnu.org> writes:
> Richard Stallman <rms@gnu.org> writes:
> > But this behaviour is *highly* confusing:
> > (/ 5 4 2.3) => 0.4347826086956522
> > Cf. (/ 5 4.0 2.3) => 0.5434782608695653
> >
> > We could change the functions to convert the arguments to floating
> > point at the start if any is floating point. Is there any reason
> > not to do that?
>
> Efficiency? Lisp is not a statically typed language. We don't know
> the type of the arguments until after they have been evaluated. We
> would have to store all intermediate results away before being
> allowed to do the first operation.
Seems like it's only a matter of changing arith_driver to do
if (FLOATP (val))
{
if (code == Adiv)
return float_arith_driver (0.0, 0, code, nargs, args);
else
return float_arith_driver ((double) accum, argnum, code,
nargs, args);
}
or similar. Loss of efficiency should be small.
> Also (/ 5 4 2.3) would no longer be equivalent to (/ (/ 5 4) 2.3).
That's more significant, as it's a user-visible change.
--
Lars Brinkhoff, Services for Unix, Linux, GCC, HTTP
Brinkhoff Consulting http://www.brinkhoff.se/
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Strange division using mixed integers and floats
2004-04-28 11:05 ` David Kastrup
2004-04-28 13:20 ` Lars Brinkhoff
@ 2004-04-28 14:02 ` Andreas Schwab
2004-04-28 15:59 ` Kevin Rodgers
2004-04-29 13:31 ` Richard Stallman
2 siblings, 1 reply; 7+ messages in thread
From: Andreas Schwab @ 2004-04-28 14:02 UTC (permalink / raw)
Cc: rms, Johan Bockgård, emacs-devel
David Kastrup <dak@gnu.org> writes:
> Efficiency? Lisp is not a statically typed language. We don't know
> the type of the arguments until after they have been evaluated.
>
> We would have to store all intermediate results away before being
> allowed to do the first operation.
Which we do anyway, since / is not a special form. Arguments of normal
functions are always evaluated before being applied.
> Also (/ 5 4 2.3) would no longer be equivalent to (/ (/ 5 4) 2.3).
I don't think it was ever documented as such. The Emacs Lisp manual only
covers the case of all arguments being integers, but does not specifically
say anything about mixed mode arguments, except that a floating point
value is returned if any argument is floating. So always using floating
point arithmetics in this case would fit the principle of least surprise.
Andreas.
--
Andreas Schwab, SuSE Labs, schwab@suse.de
SuSE Linux AG, Maxfeldstraße 5, 90409 Nürnberg, Germany
Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5
"And now for something completely different."
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Strange division using mixed integers and floats
2004-04-28 14:02 ` Andreas Schwab
@ 2004-04-28 15:59 ` Kevin Rodgers
0 siblings, 0 replies; 7+ messages in thread
From: Kevin Rodgers @ 2004-04-28 15:59 UTC (permalink / raw)
Andreas Schwab wrote:
> David Kastrup <dak@gnu.org> writes:
>>Also (/ 5 4 2.3) would no longer be equivalent to (/ (/ 5 4) 2.3).
>
> I don't think it was ever documented as such. The Emacs Lisp manual
> only covers the case of all arguments being integers, but does not
> specifically say anything about mixed mode arguments, except that a
> floating point value is returned if any argument is floating. So
> always using floating point arithmetics in this case would fit the
> principle of least surprise.
The manual says:
| If there are additional arguments DIVISORS, then it divides DIVIDEND
| by each divisor in turn.
To me that means (/ 5 4 2.3) is equivalent to (/ (/ 5 4) 2.3).
--
Kevin Rodgers
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Strange division using mixed integers and floats
2004-04-28 11:05 ` David Kastrup
2004-04-28 13:20 ` Lars Brinkhoff
2004-04-28 14:02 ` Andreas Schwab
@ 2004-04-29 13:31 ` Richard Stallman
2004-04-29 17:17 ` peta
2 siblings, 1 reply; 7+ messages in thread
From: Richard Stallman @ 2004-04-29 13:31 UTC (permalink / raw)
Cc: bojohan, emacs-devel
Efficiency? Lisp is not a statically typed language. We don't know
the type of the arguments until after they have been evaluated.
All the args have been evaluated by the time the function is called.
It just has to check their types and maybe convert the first arg
to floating point.
Also (/ 5 4 2.3) would no longer be equivalent to (/ (/ 5 4) 2.3).
I don't think that is a big loss.
^ permalink raw reply [flat|nested] 7+ messages in thread