[gambit-list] Big number Bug?
Bradley Lucier
lucier at math.purdue.edu
Wed Apr 25 23:07:26 EDT 2007
On Apr 25, 2007, at 10:25 PM, dillo gimp wrote:
>
> On 4/26/07, Bradley Lucier <lucier at math.purdue.edu> wrote:
>> I hope you don' t mind me CC'ing my reply to th list.
>>
>> On Apr 25, 2007, at 9:05 PM, dillo gimp wrote:
>>
>> >
>> >
>> > On 4/26/07, Bradley Lucier <lucier at math.purdue.edu> wrote:
>> > On Apr 25, 2007, at 7:43 PM, dillo gimp wrote:
>> >
>> > > There might be a bug in big number handling,
>> > > the same code runs fine under mzscheme and petite, but crashes
>> with
>> > > gambit :
>> > > *** ERROR IN ##ratnum.* -- Divide by zero
>> > > (quotient 0 0)
>> > >
>> > > I don't even use "quotient" in my code.
>> >
>> > We'd need to see a bit of your code to figure out what you *are*
>> > using.
>> >
>> >
>> > I don't know how to make gambit to report exactly where the code
>> > has crashed.
>> > The program is not exactly small either.
>> > Can you tell me how to make gambit report "crash point"?
>> > This is my compilation steps:
>> >
>> > cat /lfs/script/gambit.sh
>> > #!/bin/bash
>> > /usr/4.0b22/bin/gsc -prelude '(define (display x) (write x
>> (current-
>> > output-port)))' -link $1
>> > prog=${1%.sc}
>> > gcc -O2 -fomit-frame-pointer -freg-struct-return \
>> > -I/usr/4.0b22/include -L/usr/4.0b22/lib \
>> > -D___SINGLE_HOST -o $prog $prog.c ${prog}_.c -lgambc -lm -
>> ldl -
>> > lutil
>>
>> OK, well I still don't know what you're trying to do, but gambit
>> requires gcc to use certain flags for to correctly compile gambit-
>> generated code. See the options in /usr/4.0b22/bin/
>>
>
> I don't understand. I am following the exact steps from:
> http://www.iro.umontreal.ca/~gambit/doc/gambit-c.html
> http://www.iro.umontreal.ca/~gambit/doc/gambit-c_toc.html#TOC17
The documentation is in error.
You are compiling your code with the options
>> > gcc -O2 -fomit-frame-pointer -freg-struct-return \
>> > -I/usr/4.0b22/include -L/usr/4.0b22/lib \
>> > -D___SINGLE_HOST -o $prog $prog.c ${prog}_.c -lgambc -lm -
>> ldl -
These options are incorrect. You can find the correct options on
your machine in
/usr/4.0b22/bin/gsc-cc-o
which is in the same directory in which you installed gsi and gsc.
This may be causing your specific problem, but I don't know for sure.
> The program only reports:
> *** ERROR IN ##ratnum.* -- Divide by zero
> (quotient 0 0)
>
> Without a more accurate location, I can't guess what's wrong.
The code for numeric operations is in gambc-4.0b22/lib/_num.scm.
There you will find
(define-prim (##ratnum.* x y)
(let ((p (macro-ratnum-numerator x))
(q (macro-ratnum-denominator x))
(r (macro-ratnum-numerator y))
(s (macro-ratnum-denominator y)))
(if (##eq? x y)
(macro-ratnum-make (##* p p) (##* q q)) ; already in
lowest form
(let* ((gcd-ps (##gcd p s))
(gcd-rq (##gcd r q))
(num (##* (##quotient p gcd-ps) (##quotient r gcd-rq)))
(den (##* (##quotient q gcd-rq) (##quotient s gcd-ps))))
(if (##eq? den 1)
num
(macro-ratnum-make num den))))))
So, somehow, gcd-ps or gcd-rq is zero. ##ratnum.* is called only
from ##*, which is the library primitive for multiplication, and
##ratnum.* is only called when one of the arguments of * is a ratnum.
> The program is not big, but not small either, I can't cut and paste.
>
> Most importantly: I don't use quotient in my code.
> There shoudn't have any "divide by zero" code, else it would have
> crashed with other scheme implementations.
More information about the Gambit-list
mailing list