guile-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Divide by zero or how to overload a function


From: Chris Cramer
Subject: Re: Divide by zero or how to overload a function
Date: Tue, 23 Oct 2001 01:17:20 -0500
User-agent: Mutt/1.2.5i

On Tue, Oct 23, 2001 at 01:29:46AM -0400, Keith Wright wrote:
> Now here's a question for the wizards.
> Why does (/ 0) have a different result from (/ 1 0)?
> 
> guile> (/ 1 0)
> standard input:203:1: In procedure / in expression (/ 1 0):
> standard input:203:1: Numerical overflow
> ABORT: (numerical-overflow)
> guile> (/ 0)
> +#.#

Here are the relevant parts of numbers.c:

  if (SCM_UNBNDP (y)) {
    if (SCM_UNBNDP (x)) {
      SCM_WTA_DISPATCH_0 (g_divide, s_divide);
    } else if (SCM_INUMP (x)) {
      if (SCM_EQ_P (x, SCM_MAKINUM (1L)) || SCM_EQ_P (x, SCM_MAKINUM (-1L))) {
        return x;
      } else {
        return scm_make_real (1.0 / (double) SCM_INUM (x));
[...much deleted...]
  if (SCM_INUMP (x)) {
    long xx = SCM_INUM (x);
    if (SCM_INUMP (y)) {
      long yy = SCM_INUM (y);
      if (yy == 0) {
        scm_num_overflow (s_divide);
 
Notice that (/ 1.0 0.0) gives the same result as (/ 0):

guile> (/ 1.0 0.0)
+#.#

It looks like a bug. Whatever the result (/ 1.0 0.0) should be, (/ 0)
and (/ 1 0) should give the same result. I guess just add a check for
zero right before the "return scm_make_real..." line?

-- 
C. Ray C. aka Christopher Cramer
address@hidden
http://www.pyro.net/~crayc/



reply via email to

[Prev in Thread] Current Thread [Next in Thread]