On Fri, May 27, 2011 at 10:58:04AM +0200, Dominic Pearson wrote:
> Hello folks,
> 
> I am trying to compute the sum i = 0 to n where n = 1000 of n^n, but
> chicken seems to return the incorrect answer.
> 
> http://paste.call-cc.org/paste?id=e0884580a684d1220f3dedb819f63201b6f5eb1a
> 
> Racket and scheme48 both seem to give different answers too.

I figured out where it goes wrong.  expt calls the base Chicken expt and
if that returns a fixnum, this result is used (if it's a flonum it might've
overflowed and is inexact anyway so it will use a different path).

This algorithm is sound. However, base Chicken produces wrong results
for some values (and this also depends on the platform, 64 bits NetBSD libc
in this case):

#;1> (expt 999 6)
994014980014993920

This should be:
gosh> (expt 999 6)
994014980014994001

Scheme48 and Racket concur with Gauche.

The reason this goes wrong is that Chicken core does not check errno
after calling C's pow() function.

I am unsure how to fix this.  It can be worked around easily in numbers
by always choosing the "slow" path, but I think this should really be
fixed in core.  Maybe core should return +nan or +inf in cases where
errno was modified?

Cheers,
Peter
-- 
http://sjamaan.ath.cx
--
"The process of preparing programs for a digital computer
 is especially attractive, not only because it can be economically
 and scientifically rewarding, but also because it can be an aesthetic
 experience much like composing poetry or music."
                                                        -- Donald Knuth

_______________________________________________
Chicken-users mailing list
[email protected]
https://lists.nongnu.org/mailman/listinfo/chicken-users

Reply via email to