From: Paul F. D. <di...@dl...> - 2003-08-22 03:51:19
|
* (= 1.0d0 (+ 1.0d0 double-float-epsilon)) T This occurs in both sbcl (current cvs, x86 linux) and cmucl (x86, 8/1 snapshot). Paul |
From: <ger...@t-...> - 2003-08-22 03:29:34
|
"Paul F. Dietz" <di...@dl...> writes: > * (= 1.0d0 (+ 1.0d0 double-float-epsilon)) > > T > > This occurs in both sbcl (current cvs, x86 linux) and > cmucl (x86, 8/1 snapshot). On the superior OS ):-), FreeBSD x86, (= 1.0d0 (+ 1.0d0 double-float-epsilon)) => nil compiled and interpreted, if that matters. |
From: Christophe R. <cs...@ca...> - 2003-08-21 12:53:27
|
ger...@t-... (Gerd Moellmann) writes: > "Paul F. Dietz" <di...@dl...> writes: > >> * (= 1.0d0 (+ 1.0d0 double-float-epsilon)) >> >> T >> >> This occurs in both sbcl (current cvs, x86 linux) and >> cmucl (x86, 8/1 snapshot). > > On the superior OS ):-), FreeBSD x86, > > (= 1.0d0 (+ 1.0d0 double-float-epsilon)) > => nil > > compiled and interpreted, if that matters. This has been logged several times in sbcl's BUGS file: 45d and 118 both refer to this problem. As FreeBSD shows, it's almost certainly fixable, but it's tricky on the x86 because of the internal 80-bit precision which is lost if register values are made to spill onto the stack. Christophe -- http://www-jcsu.jesus.cam.ac.uk/~csr21/ +44 1223 510 299/+44 7729 383 757 (set-pprint-dispatch 'number (lambda (s o) (declare (special b)) (format s b))) (defvar b "~&Just another Lisp hacker~%") (pprint #36rJesusCollegeCambridge) |
From: Raymond T. <to...@rt...> - 2003-08-22 07:04:53
|
>>>>> "Christophe" == Christophe Rhodes <cs...@ca...> writes: Christophe> ger...@t-... (Gerd Moellmann) writes: >> "Paul F. Dietz" <di...@dl...> writes: >> >>> * (= 1.0d0 (+ 1.0d0 double-float-epsilon)) >>> >>> T >>> >>> This occurs in both sbcl (current cvs, x86 linux) and >>> cmucl (x86, 8/1 snapshot). >> >> On the superior OS ):-), FreeBSD x86, >> >> (= 1.0d0 (+ 1.0d0 double-float-epsilon)) >> => nil >> >> compiled and interpreted, if that matters. Christophe> This has been logged several times in sbcl's BUGS file: 45d and 118 Christophe> both refer to this problem. As FreeBSD shows, it's almost certainly Christophe> fixable, but it's tricky on the x86 because of the internal 80-bit Christophe> precision which is lost if register values are made to spill onto the Christophe> stack. What could FreeBSD do here that Linux doesn't other than setting a few FPU control bits? Perhaps setting the precision field to 53-bit instead of 64? CMUCL allows setting this, and when I tried that, this test works, but other weird things show up that don't when run on a Sparc. Ray |
From: Paul F. D. <di...@dl...> - 2003-08-21 23:29:46
|
Raymond Toy wrote: > What could FreeBSD do here that Linux doesn't other than setting a few > FPU control bits? Perhaps setting the precision field to 53-bit > instead of 64? CMUCL allows setting this, and when I tried that, this > test works, but other weird things show up that don't when run on a > Sparc. Here's some more information from ansi-tests, using binary search to find the actual minimum values for which the inequalities hold: Test EPSILONS.8 failed Form: (FLET ((%CHECK (X) (/= 1.0d0 (+ 1.0d0 X)))) (LET ((EPS (FLOAT-BINARY-SEARCH #'%CHECK 0.0d0 1.0d0))) (IF (= EPS DOUBLE-FLOAT-EPSILON) :GOOD (LIST EPS DOUBLE-FLOAT-EPSILON)))) Expected value: :GOOD Actual value: (1.1107651257113996d-16 1.1102230246251568d-16). Test EPSILONS.12 failed Form: (FLET ((%CHECK (X) (/= 1.0d0 (- 1.0d0 X)))) (LET ((EPS (FLOAT-BINARY-SEARCH #'%CHECK 0.0d0 1.0d0))) (IF (= EPS DOUBLE-FLOAT-NEGATIVE-EPSILON) :GOOD (LIST EPS DOUBLE-FLOAT-NEGATIVE-EPSILON)))) Expected value: :GOOD Actual value: (5.553825628556998d-17 5.551115123125784d-17). Paul |
From: <ger...@t-...> - 2003-08-22 08:39:24
|
"Paul F. Dietz" <di...@dl...> writes: > Test EPSILONS.8 failed > Test EPSILONS.12 failed FWIW, both succeed here. Running the tests shows only four new failures: ROUND.10, ROUND.11, FROUND.10, FROUND.11. Haven't looked into these. |
From: <ger...@t-...> - 2003-08-22 09:13:59
|
Gerd Moellmann <ger...@t-...> writes: > Running the tests shows only four new failures: ROUND.10, ROUND.11, > FROUND.10, FROUND.11. Haven't looked into these. I think the patch below fixes the ROUND/FROUND failures, which fail for something like (round least-positive-short-float least-positive-short-float) Could someone please confirm? Index: numbers.lisp =================================================================== RCS file: /home/CVS-cmucl/src/code/numbers.lisp,v retrieving revision 1.48 diff -u -u -r1.48 numbers.lisp --- numbers.lisp 19 Aug 2003 12:23:36 -0000 1.48 +++ numbers.lisp 22 Aug 2003 09:08:05 -0000 @@ -733,19 +733,21 @@ (if (eql divisor 1) (round number) (multiple-value-bind (tru rem) (truncate number divisor) - (let ((thresh (/ (abs divisor) 2))) - (cond ((or (> rem thresh) - (and (= rem thresh) (oddp tru))) - (if (minusp divisor) - (values (- tru 1) (+ rem divisor)) - (values (+ tru 1) (- rem divisor)))) - ((let ((-thresh (- thresh))) - (or (< rem -thresh) - (and (= rem -thresh) (oddp tru)))) - (if (minusp divisor) - (values (+ tru 1) (- rem divisor)) - (values (- tru 1) (+ rem divisor)))) - (t (values tru rem))))))) + (if (zerop rem) + (values (if (minusp tru) -1 1) rem) + (let ((thresh (/ (abs divisor) 2))) + (cond ((or (> rem thresh) + (and (= rem thresh) (oddp tru))) + (if (minusp divisor) + (values (- tru 1) (+ rem divisor)) + (values (+ tru 1) (- rem divisor)))) + ((let ((-thresh (- thresh))) + (or (< rem -thresh) + (and (= rem -thresh) (oddp tru)))) + (if (minusp divisor) + (values (+ tru 1) (- rem divisor)) + (values (- tru 1) (+ rem divisor)))) + (t (values tru rem)))))))) (defun rem (number divisor) |
From: Andreas F. <as...@vo...> - 2003-08-21 17:04:01
|
Today, Gerd Moellmann <ger...@t-...> wrote: > On the superior OS ):-), FreeBSD x86, > > (= 1.0d0 (+ 1.0d0 double-float-epsilon)) > => nil That must be on cmucl, because for me, sbcl on Freebsd/x86, gives: * (= 1.0d0 (+ 1.0d0 double-float-epsilon)) T -- Andreas Fuchs, <as...@ac...>, as...@ja..., antifuchs |
From: Sven C. K. <sc...@sn...> - 2003-08-22 23:30:20
|
On Thu, Aug 21, 2003 at 12:57:02PM +0000, Andreas Fuchs wrote: > That must be on cmucl, because for me, sbcl on Freebsd/x86, gives: > > * (= 1.0d0 (+ 1.0d0 double-float-epsilon)) I'd rather say it's because FreeBSD and Linux use the FPU differently. Take a look at the first paragraphs of <http://lists.insecure.org/lists/linux-kernel/2001/Mar/0490.html>. Regards, Sven |
From: Peter G. <pe...@ar...> - 2003-08-22 18:56:07
|
> + (if (zerop rem) > + (values (if (minusp tru) -1 1) rem) > + (let ((thresh (/ (abs divisor) 2))) > + (cond ((or (> rem thresh) > + (and (= rem thresh) (oddp tru))) > + (if (minusp divisor) > + (values (- tru 1) (+ rem divisor)) > + (values (+ tru 1) (- rem divisor)))) > + ((let ((-thresh (- thresh))) > + (or (< rem -thresh) > + (and (= rem -thresh) (oddp tru)))) > + (if (minusp divisor) > + (values (+ tru 1) (- rem divisor)) > + (values (- tru 1) (+ rem divisor)))) > + (t (values tru rem)))))))) Shouldn't this be: (if (zerop rem) (values tru rem) ... -Peter |
From: <ger...@t-...> - 2003-08-23 10:16:28
|
Peter Graves <pe...@ar...> writes: > Shouldn't this be: > > (if (zerop rem) > (values tru rem) Yes, that's simpler. |
From: Michael H. <mw...@py...> - 2003-08-23 00:40:36
|
Raymond Toy <to...@rt...> writes: > What could FreeBSD do here that Linux doesn't other than setting a few > FPU control bits? IIRC, the value of d-f-e according to the hyperspec (the least float such that...) depends on the x86 fpu's rounding mode, which together with it's mandation as a constant value makes for an awkward situation. I guess it would make sense for d-f-e to have the right value when sbcl starts up, though. Cheers, mwh -- Two decades later, well-known hacker Henry Spencer described the Perl scripting language as a "Swiss-Army chainsaw", intending to convey his evaluation of the language as exceedingly powerful but ugly and noisy and prone to belch noxious fumes. -- the jargon file |
From: Andreas F. <as...@vo...> - 2003-08-23 15:03:26
|
On 2003-08-22, Sven C. Koehler <sc...@sn...> wrote: > On Thu, Aug 21, 2003 at 12:57:02PM +0000, Andreas Fuchs wrote: >> That must be on cmucl, because for me, sbcl on Freebsd/x86, gives: >> >> * (= 1.0d0 (+ 1.0d0 double-float-epsilon)) >> T > > I'd rather say it's because FreeBSD and Linux use the FPU differently. not quite. cmucl on freebsd/x86 gives NIL; sbcl on freebsd/x86 gives T, so this is not only related to freebsd's superiority (-; > Take a look at the first paragraphs of > <http://lists.insecure.org/lists/linux-kernel/2001/Mar/0490.html>. Thanks for the pointer. -- Andreas Fuchs, <as...@ac...>, as...@ja..., antifuchs |