From: Bruno H. <br...@cl...> - 2004-10-08 15:01:00
|
SBCL 0.8.13 crashes on a simple sequence of bignum operations: * (integer-length (sqrt (ash 1 1000000))) debugger invoked on a SIMPLE-TYPE-ERROR in thread 8303: Too large to be represented as a DOUBLE-FLOAT: Argh! gc_find_freeish_pages failed (restart_page), nbytes=110112. Gen Boxed Unboxed LB LUB !move Alloc Waste Trig WP GCs Mem-age 0: 3 0 1053 0 0 4305304 20072 2000000 0 0 0.0000 1: 2 0 0 12746 12748 50956368 1259440 2000000 0 0 0.5006 2: 11 1 0 117227 117237 471929536 8281408 346429680 1 1 0.7298 3: 0 0 0 0 0 0 0 2000000 0 0 0.0000 4: 0 0 0 0 0 0 0 2000000 0 0 0.0000 5: 0 0 0 0 0 0 0 2000000 0 0 0.0000 6: 0 0 0 0 0 0 0 0 0 0 0.0000 Total bytes allocated=527191208 fatal error encountered in SBCL pid 8303 The system is too badly corrupted or confused to continue at the Lisp level. If the system had been compiled with the SB-LDB feature, we'd drop into the LDB low-level debugger now. But there's no LDB in this build, so we can't really do anything but just exit, sorry. $ Bruno |
From: William H. N. <wil...@ai...> - 2004-10-08 18:05:21
|
On Fri, Oct 08, 2004 at 04:55:48PM +0200, Bruno Haible wrote: > SBCL 0.8.13 crashes on a simple sequence of bignum operations: > > * (integer-length (sqrt (ash 1 1000000))) > > debugger invoked on a SIMPLE-TYPE-ERROR in thread 8303: > Too large to be represented as a DOUBLE-FLOAT: > Argh! gc_find_freeish_pages failed (restart_page), nbytes=110112. > Gen Boxed Unboxed LB LUB !move Alloc Waste Trig WP GCs Mem-age > 0: 3 0 1053 0 0 4305304 20072 2000000 0 0 0.0000 > 1: 2 0 0 12746 12748 50956368 1259440 2000000 0 0 0.5006 > 2: 11 1 0 117227 117237 471929536 8281408 346429680 1 1 0.7298 > 3: 0 0 0 0 0 0 0 2000000 0 0 0.0000 > 4: 0 0 0 0 0 0 0 2000000 0 0 0.0000 > 5: 0 0 0 0 0 0 0 2000000 0 0 0.0000 > 6: 0 0 0 0 0 0 0 0 0 0 0.0000 > Total bytes allocated=527191208 > fatal error encountered in SBCL pid 8303 > The system is too badly corrupted or confused to continue at the Lisp > level. If the system had been compiled with the SB-LDB feature, we'd drop > into the LDB low-level debugger now. But there's no LDB in this build, so > we can't really do anything but just exit, sorry. > $ Yikes. The same failure occurs in my 0.8.15.8 here, and even on just bare (SQRT (ASH 1 1000000)) or (ASH 1 1000000) without the INTEGER-LENGTH or SQRT. The problem seems to be in the printer; (DEFPARAMETER *FOO* (ASH 1 1000000)) is OK. Unless someone cleverly comes up with a fix before I get around to it (hopefully soon, certainly before the next release), I will at least log it in the BUGS file. Thank you for pointing it out. -- William Harold Newman <wil...@ai...> Such a new mode would surely count as "the next really big enormous thing." -- <http://hanson.gmu.edu/bigthing.html> |
From: Paul F. D. <di...@dl...> - 2004-10-09 13:00:50
|
Christophe Rhodes wrote: > The bignum printer indeed uses the stupidest possible (recursive) > algorithm. It ought to be relatively trivial to convert it to the > naive iterative algorithm (which would have the effect of allowing the > system to garbage collect intermediate values, as compared with the > recursive behaviour of keeping them all around)... but I'm off to > Spain for six days, so it won't be I who does it in the near future. This algorithm repeatedly takes the quotient modulo base^k, finding the high order digit, then the next, etc? It may be faster to divide-and-conquer: if (floor (log n base)) is k, then if k is sufficiently large compute (floor n (expt base (floor k 2))) and handle the quotient and remainder recursively. Paul |
From: Nikodemus S. <tsi...@cc...> - 2004-11-08 14:29:38
|
On Sat, 9 Oct 2004, Paul F. Dietz wrote: > It may be faster to divide-and-conquer: if (floor (log n base)) is k, > then if k is sufficiently large compute (floor n (expt base (floor k 2))) > and handle the quotient and remainder recursively. Something along these lines has been implemented in 0.8.16.36, allowing (ash 1 1000000) to be printed. Thanks for the suggestion! Cheers, -- Nikodemus Schemer: "Buddha is small, clean, and serious." Lispnik: "Buddha is big, has hairy armpits, and laughs." |
From: Christophe R. <cs...@ca...> - 2004-10-08 20:11:56
|
William Harold Newman <wil...@ai...> writes: > (ASH 1 1000000) > without the INTEGER-LENGTH or SQRT. The problem seems to be in the > printer; The bignum printer indeed uses the stupidest possible (recursive) algorithm. It ought to be relatively trivial to convert it to the naive iterative algorithm (which would have the effect of allowing the system to garbage collect intermediate values, as compared with the recursive behaviour of keeping them all around)... but I'm off to Spain for six days, so it won't be I who does it in the near future. Cheers, Christophe |