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]