Update of /cvsroot/sbcl/sbcl/src/compiler
In directory fdv4jf1.ch3.sourceforge.com:/tmp/cvs-serv22656/src/compiler
18.104.22.168: floating point implementation smoothing
To get floating point stuff exactly right, we should build a complete
IEEE float implementation to do calculations in for the cross-compiler.
Since that's not going to happen this millennium, instead try to be
careful when writing code that looks constant-foldable. Some other
fixups on the way...
6 messages follow:
fix load-time tests in src/code/pred
It turns out that #c(1.1 0) is not portable: it's a REAL in clisp and a
COMPLEX in sbcl.
begin work on floats
Floats Are Hard. The issue is that the host's float implementation,
even if it agrees with SBCL that SINGLE-FLOAT is IEEE single and
DOUBLE-FLOAT is IEEE double, may not match sbcl idiosyncracy for
idiosyncracy. For example, clisp doesn't support denormals, so its
LEAST-FOOATIVE-QUUXLE-FLOAT constants are very different from sbcl's:
and sbcl's can't even be represented within the host. Ugh.
Defining the print-related MIN-E constants is, however, easy enough.
comment (well, #!+long-float) out some floating point constants
The clauses in question were never taken absent #!+long-float anyway.
-0.0 is not portable: many lisps don't respect negative zeros
Use make-unportable-float instead, and hope that this doesn't matter
host floating point differences
Not all lisps think (log 2d0 10d0) is the same. Compute it accurately
and use LOAD-TIME-VALUE.
tentative attempt at smoothing over host floating point differences
Compute all the necessary constants as double-float bit patterns using
RCS file: /cvsroot/sbcl/sbcl/src/compiler/srctran.lisp,v
retrieving revision 1.165
retrieving revision 1.166
diff -u -d -r1.165 -r1.166
--- srctran.lisp 24 Apr 2009 13:11:22 -0000 1.165
+++ srctran.lisp 24 Apr 2009 14:41:55 -0000 1.166
@@ -1096,7 +1096,7 @@
;; (float x (+0.0)) => (or (member -0.0) (float x (0.0)))
;; (float x -0.0) => (or (member -0.0) (float x (0.0)))
- (list (make-member-type :members (list (float -0.0 hi-val)))
+ (list (make-member-type :members (list (float (load-time-value (make-unportable-float :single-float-negative-zero)) hi-val)))
(make-numeric-type :class (numeric-type-class type)
:format (numeric-type-format type)