Path: ...!news.nobody.at!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: David De La Harpe Golden Newsgroups: comp.lang.lisp Subject: Re: Optimization flag for unchecked fixnums in SBCL? Date: Sun, 11 Aug 2024 02:32:26 +0100 Organization: A noiseless patient Spider Lines: 73 Message-ID: References: <87h6bwrufd.fsf@nightsong.com> <87zfplhyjg.fsf@nightsong.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Injection-Date: Sun, 11 Aug 2024 03:32:27 +0200 (CEST) Injection-Info: dont-email.me; posting-host="dcb1311a197eeb2b316c7dbcaa60d1d0"; logging-data="1188418"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX19YiLXd213Tlxyjdo50w1Onk++sKGzf+RE6bpjKqYR1bQ==" User-Agent: Mozilla Thunderbird Cancel-Lock: sha1:/3fQHkj4IB5/ypPsgEaVEltERc0= In-Reply-To: <87zfplhyjg.fsf@nightsong.com> Content-Language: en-US Bytes: 3319 On 10/08/2024 04:00, Paul Rubin wrote: > The "trick" of this Euler problem is that a few (only a few) of > the intermediate values will overflow a 32 bit word. But, everyone uses > 64 bit machines these days, so that part works anyway. Ah, good point. (erm, last (signed-byte 29) part my prev post probably only worked because - at (safety 0) - it was indeed generating code using unchecked >32-bit signed arithmetic ops on my 64-bit machine anyway) Worth noting in context that if you use sbcl with (safety 3) ON and use (signed-byte 32) say, though, then the type-declarations-as-assertions nicely catches the problem (at runtime with dynamic check) $ head -n2 collatz-signed-byte-32-inline-safe.lisp (declaim (optimize (speed 0) (safety 3) (debug 3))) (declaim (ftype (function ((signed-byte 32)) (values (signed-byte 32) &optional)) collatz)) $ sbcl --control-stack-size 1024 --dynamic-space-size 65536 * (compile-file "collatz-signed-byte-32-inline-safe.lisp") [...] * (load "collatz-signed-byte-32-inline-safe.fasl") debugger invoked on a TYPE-ERROR @535D60FF in thread #: The value 2482111348 is not of type (SIGNED-BYTE 32) from the function type declaration. Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL. restarts (invokable by number or by possibly-abbreviated name): 0: [ABORT] Exit debugger, returning to top level. (COLLATZ 827370449) Playing about for n 1000000, apparently (signed-byte 37) enough... $ sbcl --control-stack-size 2048 --dynamic-space-size 65536 --script collatz-signed-byte-36-inline-safe.lisp Unhandled TYPE-ERROR in thread #: The value 34988856874 is not of type (SIGNED-BYTE 36) from the function type declaration. [...] $ sbcl --control-stack-size 2048 --dynamic-space-size 65536 --script collatz-signed-byte-37-inline-safe.lisp (837799 525)