unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* Re: Strange division using mixed integers and floats
       [not found] <yoijk702ye7i.fsf@frealaf.dd.chalmers.se>
@ 2004-04-28 10:13 ` Richard Stallman
  2004-04-28 11:05   ` David Kastrup
  0 siblings, 1 reply; 7+ messages in thread
From: Richard Stallman @ 2004-04-28 10:13 UTC (permalink / raw)
  Cc: emacs-devel

    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?

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

* Re: Strange division using mixed integers and floats
  2004-04-28 10:13 ` Strange division using mixed integers and floats Richard Stallman
@ 2004-04-28 11:05   ` David Kastrup
  2004-04-28 13:20     ` Lars Brinkhoff
                       ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: David Kastrup @ 2004-04-28 11:05 UTC (permalink / raw)
  Cc: Johan Bockgård, emacs-devel

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.

Also (/ 5 4 2.3) would no longer be equivalent to (/ (/ 5 4) 2.3).

-- 
David Kastrup, Kriemhildstr. 15, 44793 Bochum

^ 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
  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

* Re: Strange division using mixed integers and floats
  2004-04-29 13:31     ` Richard Stallman
@ 2004-04-29 17:17       ` peta
  0 siblings, 0 replies; 7+ messages in thread
From: peta @ 2004-04-29 17:17 UTC (permalink / raw)
  Cc: David Kastrup, rms, bojohan


>     Also (/ 5 4 2.3) would no longer be equivalent to (/ (/ 5 4) 2.3).
> 
> I don't think that is a big loss.

In ansii common lisp they are equivalent, but that is because integer
division gives a rational result.  So in the absence of rational numbers
converting all arguments to float would be a close approximation of the
same.

-- 
Peter Whaite (http://whaite.ca)

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

end of thread, other threads:[~2004-04-29 17:17 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <yoijk702ye7i.fsf@frealaf.dd.chalmers.se>
2004-04-28 10:13 ` Strange division using mixed integers and floats Richard Stallman
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
2004-04-29 17:17       ` peta

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

	https://git.savannah.gnu.org/cgit/emacs.git

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 read-only IMAP folder(s) and NNTP newsgroup(s).