1.0.3.30: More compact typechecks on x86-64
[sbcl.git] / src / code / float.lisp
blob9e8ae74abc86da480aa4773d4f17ea34b2385327
1 ;;;; This file contains the definitions of float-specific number
2 ;;;; support (other than irrational stuff, which is in irrat.) There is
3 ;;;; code in here that assumes there are only two float formats: IEEE
4 ;;;; single and double. (LONG-FLOAT support has been added, but bugs
5 ;;;; may still remain due to old code which assumes this dichotomy.)
7 ;;;; This software is part of the SBCL system. See the README file for
8 ;;;; more information.
9 ;;;;
10 ;;;; This software is derived from the CMU CL system, which was
11 ;;;; written at Carnegie Mellon University and released into the
12 ;;;; public domain. The software is in the public domain and is
13 ;;;; provided with absolutely no warranty. See the COPYING and CREDITS
14 ;;;; files for more information.
16 (in-package "SB!KERNEL")
18 ;;;; float predicates and environment query
20 #!-sb-fluid
21 (declaim (maybe-inline float-denormalized-p float-infinity-p float-nan-p
22 float-trapping-nan-p))
24 (defun float-denormalized-p (x)
25 #!+sb-doc
26 "Return true if the float X is denormalized."
27 (number-dispatch ((x float))
28 ((single-float)
29 (and (zerop (ldb sb!vm:single-float-exponent-byte (single-float-bits x)))
30 (not (zerop x))))
31 ((double-float)
32 (and (zerop (ldb sb!vm:double-float-exponent-byte
33 (double-float-high-bits x)))
34 (not (zerop x))))
35 #!+(and long-float x86)
36 ((long-float)
37 (and (zerop (ldb sb!vm:long-float-exponent-byte (long-float-exp-bits x)))
38 (not (zerop x))))))
40 (defmacro !define-float-dispatching-function
41 (name doc single double #!+(and long-float x86) long)
42 `(defun ,name (x)
43 ,doc
44 (number-dispatch ((x float))
45 ((single-float)
46 (let ((bits (single-float-bits x)))
47 (and (> (ldb sb!vm:single-float-exponent-byte bits)
48 sb!vm:single-float-normal-exponent-max)
49 ,single)))
50 ((double-float)
51 (let ((hi (double-float-high-bits x))
52 (lo (double-float-low-bits x)))
53 (declare (ignorable lo))
54 (and (> (ldb sb!vm:double-float-exponent-byte hi)
55 sb!vm:double-float-normal-exponent-max)
56 ,double)))
57 #!+(and long-float x86)
58 ((long-float)
59 (let ((exp (long-float-exp-bits x))
60 (hi (long-float-high-bits x))
61 (lo (long-float-low-bits x)))
62 (declare (ignorable lo))
63 (and (> (ldb sb!vm:long-float-exponent-byte exp)
64 sb!vm:long-float-normal-exponent-max)
65 ,long))))))
67 (!define-float-dispatching-function float-infinity-p
68 "Return true if the float X is an infinity (+ or -)."
69 (zerop (ldb sb!vm:single-float-significand-byte bits))
70 (and (zerop (ldb sb!vm:double-float-significand-byte hi))
71 (zerop lo))
72 #!+(and long-float x86)
73 (and (zerop (ldb sb!vm:long-float-significand-byte hi))
74 (zerop lo)))
76 (!define-float-dispatching-function float-nan-p
77 "Return true if the float X is a NaN (Not a Number)."
78 (not (zerop (ldb sb!vm:single-float-significand-byte bits)))
79 (or (not (zerop (ldb sb!vm:double-float-significand-byte hi)))
80 (not (zerop lo)))
81 #!+(and long-float x86)
82 (or (not (zerop (ldb sb!vm:long-float-significand-byte hi)))
83 (not (zerop lo))))
85 (!define-float-dispatching-function float-trapping-nan-p
86 "Return true if the float X is a trapping NaN (Not a Number)."
87 (zerop (logand (ldb sb!vm:single-float-significand-byte bits)
88 sb!vm:single-float-trapping-nan-bit))
89 (zerop (logand (ldb sb!vm:double-float-significand-byte hi)
90 sb!vm:double-float-trapping-nan-bit))
91 #!+(and long-float x86)
92 (zerop (logand (ldb sb!vm:long-float-significand-byte hi)
93 sb!vm:long-float-trapping-nan-bit)))
95 ;;; If denormalized, use a subfunction from INTEGER-DECODE-FLOAT to find the
96 ;;; actual exponent (and hence how denormalized it is), otherwise we just
97 ;;; return the number of digits or 0.
98 #!-sb-fluid (declaim (maybe-inline float-precision))
99 (defun float-precision (f)
100 #!+sb-doc
101 "Return a non-negative number of significant digits in its float argument.
102 Will be less than FLOAT-DIGITS if denormalized or zero."
103 (macrolet ((frob (digits bias decode)
104 `(cond ((zerop f) 0)
105 ((float-denormalized-p f)
106 (multiple-value-bind (ignore exp) (,decode f)
107 (declare (ignore ignore))
108 (truly-the fixnum
109 (+ ,digits (1- ,digits) ,bias exp))))
111 ,digits))))
112 (number-dispatch ((f float))
113 ((single-float)
114 (frob sb!vm:single-float-digits sb!vm:single-float-bias
115 integer-decode-single-denorm))
116 ((double-float)
117 (frob sb!vm:double-float-digits sb!vm:double-float-bias
118 integer-decode-double-denorm))
119 #!+long-float
120 ((long-float)
121 (frob sb!vm:long-float-digits sb!vm:long-float-bias
122 integer-decode-long-denorm)))))
124 (defun float-sign (float1 &optional (float2 (float 1 float1)))
125 #!+sb-doc
126 "Return a floating-point number that has the same sign as
127 FLOAT1 and, if FLOAT2 is given, has the same absolute value
128 as FLOAT2."
129 (declare (float float1 float2))
130 (* (if (etypecase float1
131 (single-float (minusp (single-float-bits float1)))
132 (double-float (minusp (double-float-high-bits float1)))
133 #!+long-float
134 (long-float (minusp (long-float-exp-bits float1))))
135 (float -1 float1)
136 (float 1 float1))
137 (abs float2)))
139 (defun float-format-digits (format)
140 (ecase format
141 ((short-float single-float) sb!vm:single-float-digits)
142 ((double-float #!-long-float long-float) sb!vm:double-float-digits)
143 #!+long-float
144 (long-float sb!vm:long-float-digits)))
146 #!-sb-fluid (declaim (inline float-digits float-radix))
148 (defun float-digits (f)
149 (number-dispatch ((f float))
150 ((single-float) sb!vm:single-float-digits)
151 ((double-float) sb!vm:double-float-digits)
152 #!+long-float
153 ((long-float) sb!vm:long-float-digits)))
155 (defun float-radix (x)
156 #!+sb-doc
157 "Return (as an integer) the radix b of its floating-point argument."
158 (declare (ignore x))
161 ;;;; INTEGER-DECODE-FLOAT and DECODE-FLOAT
163 #!-sb-fluid
164 (declaim (maybe-inline integer-decode-single-float
165 integer-decode-double-float))
167 ;;; Handle the denormalized case of INTEGER-DECODE-FLOAT for SINGLE-FLOAT.
168 (defun integer-decode-single-denorm (x)
169 (declare (type single-float x))
170 (let* ((bits (single-float-bits (abs x)))
171 (sig (ash (ldb sb!vm:single-float-significand-byte bits) 1))
172 (extra-bias 0))
173 (declare (type (unsigned-byte 24) sig)
174 (type (integer 0 23) extra-bias))
175 (loop
176 (unless (zerop (logand sig sb!vm:single-float-hidden-bit))
177 (return))
178 (setq sig (ash sig 1))
179 (incf extra-bias))
180 (values sig
181 (- (- sb!vm:single-float-bias)
182 sb!vm:single-float-digits
183 extra-bias)
184 (if (minusp (float-sign x)) -1 1))))
186 ;;; Handle the single-float case of INTEGER-DECODE-FLOAT. If an infinity or
187 ;;; NaN, error. If a denorm, call i-d-s-DENORM to handle it.
188 (defun integer-decode-single-float (x)
189 (declare (single-float x))
190 (let* ((bits (single-float-bits (abs x)))
191 (exp (ldb sb!vm:single-float-exponent-byte bits))
192 (sig (ldb sb!vm:single-float-significand-byte bits))
193 (sign (if (minusp (float-sign x)) -1 1))
194 (biased (- exp sb!vm:single-float-bias sb!vm:single-float-digits)))
195 (declare (fixnum biased))
196 (unless (<= exp sb!vm:single-float-normal-exponent-max)
197 (error "can't decode NaN or infinity: ~S" x))
198 (cond ((and (zerop exp) (zerop sig))
199 (values 0 biased sign))
200 ((< exp sb!vm:single-float-normal-exponent-min)
201 (integer-decode-single-denorm x))
203 (values (logior sig sb!vm:single-float-hidden-bit) biased sign)))))
205 ;;; like INTEGER-DECODE-SINGLE-DENORM, only doubly so
206 (defun integer-decode-double-denorm (x)
207 (declare (type double-float x))
208 (let* ((high-bits (double-float-high-bits (abs x)))
209 (sig-high (ldb sb!vm:double-float-significand-byte high-bits))
210 (low-bits (double-float-low-bits x))
211 (sign (if (minusp (float-sign x)) -1 1))
212 (biased (- (- sb!vm:double-float-bias) sb!vm:double-float-digits)))
213 (if (zerop sig-high)
214 (let ((sig low-bits)
215 (extra-bias (- sb!vm:double-float-digits 33))
216 (bit (ash 1 31)))
217 (declare (type (unsigned-byte 32) sig) (fixnum extra-bias))
218 (loop
219 (unless (zerop (logand sig bit)) (return))
220 (setq sig (ash sig 1))
221 (incf extra-bias))
222 (values (ash sig (- sb!vm:double-float-digits 32))
223 (truly-the fixnum (- biased extra-bias))
224 sign))
225 (let ((sig (ash sig-high 1))
226 (extra-bias 0))
227 (declare (type (unsigned-byte 32) sig) (fixnum extra-bias))
228 (loop
229 (unless (zerop (logand sig sb!vm:double-float-hidden-bit))
230 (return))
231 (setq sig (ash sig 1))
232 (incf extra-bias))
233 (values (logior (ash sig 32) (ash low-bits (1- extra-bias)))
234 (truly-the fixnum (- biased extra-bias))
235 sign)))))
237 ;;; like INTEGER-DECODE-SINGLE-FLOAT, only doubly so
238 (defun integer-decode-double-float (x)
239 (declare (double-float x))
240 (let* ((abs (abs x))
241 (hi (double-float-high-bits abs))
242 (lo (double-float-low-bits abs))
243 (exp (ldb sb!vm:double-float-exponent-byte hi))
244 (sig (ldb sb!vm:double-float-significand-byte hi))
245 (sign (if (minusp (float-sign x)) -1 1))
246 (biased (- exp sb!vm:double-float-bias sb!vm:double-float-digits)))
247 (declare (fixnum biased))
248 (unless (<= exp sb!vm:double-float-normal-exponent-max)
249 (error "Can't decode NaN or infinity: ~S." x))
250 (cond ((and (zerop exp) (zerop sig) (zerop lo))
251 (values 0 biased sign))
252 ((< exp sb!vm:double-float-normal-exponent-min)
253 (integer-decode-double-denorm x))
255 (values
256 (logior (ash (logior (ldb sb!vm:double-float-significand-byte hi)
257 sb!vm:double-float-hidden-bit)
260 biased sign)))))
262 #!+(and long-float x86)
263 (defun integer-decode-long-denorm (x)
264 (declare (type long-float x))
265 (let* ((high-bits (long-float-high-bits (abs x)))
266 (sig-high (ldb sb!vm:long-float-significand-byte high-bits))
267 (low-bits (long-float-low-bits x))
268 (sign (if (minusp (float-sign x)) -1 1))
269 (biased (- (- sb!vm:long-float-bias) sb!vm:long-float-digits)))
270 (if (zerop sig-high)
271 (let ((sig low-bits)
272 (extra-bias (- sb!vm:long-float-digits 33))
273 (bit (ash 1 31)))
274 (declare (type (unsigned-byte 32) sig) (fixnum extra-bias))
275 (loop
276 (unless (zerop (logand sig bit)) (return))
277 (setq sig (ash sig 1))
278 (incf extra-bias))
279 (values (ash sig (- sb!vm:long-float-digits 32))
280 (truly-the fixnum (- biased extra-bias))
281 sign))
282 (let ((sig (ash sig-high 1))
283 (extra-bias 0))
284 (declare (type (unsigned-byte 32) sig) (fixnum extra-bias))
285 (loop
286 (unless (zerop (logand sig sb!vm:long-float-hidden-bit))
287 (return))
288 (setq sig (ash sig 1))
289 (incf extra-bias))
290 (values (logior (ash sig 32) (ash low-bits (1- extra-bias)))
291 (truly-the fixnum (- biased extra-bias))
292 sign)))))
294 #!+(and long-float x86)
295 (defun integer-decode-long-float (x)
296 (declare (long-float x))
297 (let* ((hi (long-float-high-bits x))
298 (lo (long-float-low-bits x))
299 (exp-bits (long-float-exp-bits x))
300 (exp (ldb sb!vm:long-float-exponent-byte exp-bits))
301 (sign (if (minusp exp-bits) -1 1))
302 (biased (- exp sb!vm:long-float-bias sb!vm:long-float-digits)))
303 (declare (fixnum biased))
304 (unless (<= exp sb!vm:long-float-normal-exponent-max)
305 (error "can't decode NaN or infinity: ~S" x))
306 (cond ((and (zerop exp) (zerop hi) (zerop lo))
307 (values 0 biased sign))
308 ((< exp sb!vm:long-float-normal-exponent-min)
309 (integer-decode-long-denorm x))
311 (values (logior (ash hi 32) lo) biased sign)))))
313 ;;; Dispatch to the correct type-specific i-d-f function.
314 (defun integer-decode-float (x)
315 #!+sb-doc
316 "Return three values:
317 1) an integer representation of the significand.
318 2) the exponent for the power of 2 that the significand must be multiplied
319 by to get the actual value. This differs from the DECODE-FLOAT exponent
320 by FLOAT-DIGITS, since the significand has been scaled to have all its
321 digits before the radix point.
322 3) -1 or 1 (i.e. the sign of the argument.)"
323 (number-dispatch ((x float))
324 ((single-float)
325 (integer-decode-single-float x))
326 ((double-float)
327 (integer-decode-double-float x))
328 #!+long-float
329 ((long-float)
330 (integer-decode-long-float x))))
332 #!-sb-fluid (declaim (maybe-inline decode-single-float decode-double-float))
334 ;;; Handle the denormalized case of DECODE-SINGLE-FLOAT. We call
335 ;;; INTEGER-DECODE-SINGLE-DENORM and then make the result into a float.
336 (defun decode-single-denorm (x)
337 (declare (type single-float x))
338 (multiple-value-bind (sig exp sign) (integer-decode-single-denorm x)
339 (values (make-single-float
340 (dpb sig sb!vm:single-float-significand-byte
341 (dpb sb!vm:single-float-bias
342 sb!vm:single-float-exponent-byte
343 0)))
344 (truly-the fixnum (+ exp sb!vm:single-float-digits))
345 (float sign x))))
347 ;;; Handle the single-float case of DECODE-FLOAT. If an infinity or NaN,
348 ;;; error. If a denorm, call d-s-DENORM to handle it.
349 (defun decode-single-float (x)
350 (declare (single-float x))
351 (let* ((bits (single-float-bits (abs x)))
352 (exp (ldb sb!vm:single-float-exponent-byte bits))
353 (sign (float-sign x))
354 (biased (truly-the single-float-exponent
355 (- exp sb!vm:single-float-bias))))
356 (unless (<= exp sb!vm:single-float-normal-exponent-max)
357 (error "can't decode NaN or infinity: ~S" x))
358 (cond ((zerop x)
359 (values 0.0f0 biased sign))
360 ((< exp sb!vm:single-float-normal-exponent-min)
361 (decode-single-denorm x))
363 (values (make-single-float
364 (dpb sb!vm:single-float-bias
365 sb!vm:single-float-exponent-byte
366 bits))
367 biased sign)))))
369 ;;; like DECODE-SINGLE-DENORM, only doubly so
370 (defun decode-double-denorm (x)
371 (declare (double-float x))
372 (multiple-value-bind (sig exp sign) (integer-decode-double-denorm x)
373 (values (make-double-float
374 (dpb (logand (ash sig -32) (lognot sb!vm:double-float-hidden-bit))
375 sb!vm:double-float-significand-byte
376 (dpb sb!vm:double-float-bias
377 sb!vm:double-float-exponent-byte 0))
378 (ldb (byte 32 0) sig))
379 (truly-the fixnum (+ exp sb!vm:double-float-digits))
380 (float sign x))))
382 ;;; like DECODE-SINGLE-FLOAT, only doubly so
383 (defun decode-double-float (x)
384 (declare (double-float x))
385 (let* ((abs (abs x))
386 (hi (double-float-high-bits abs))
387 (lo (double-float-low-bits abs))
388 (exp (ldb sb!vm:double-float-exponent-byte hi))
389 (sign (float-sign x))
390 (biased (truly-the double-float-exponent
391 (- exp sb!vm:double-float-bias))))
392 (unless (<= exp sb!vm:double-float-normal-exponent-max)
393 (error "can't decode NaN or infinity: ~S" x))
394 (cond ((zerop x)
395 (values 0.0d0 biased sign))
396 ((< exp sb!vm:double-float-normal-exponent-min)
397 (decode-double-denorm x))
399 (values (make-double-float
400 (dpb sb!vm:double-float-bias
401 sb!vm:double-float-exponent-byte hi)
403 biased sign)))))
405 #!+(and long-float x86)
406 (defun decode-long-denorm (x)
407 (declare (long-float x))
408 (multiple-value-bind (sig exp sign) (integer-decode-long-denorm x)
409 (values (make-long-float sb!vm:long-float-bias (ash sig -32)
410 (ldb (byte 32 0) sig))
411 (truly-the fixnum (+ exp sb!vm:long-float-digits))
412 (float sign x))))
414 #!+(and long-float x86)
415 (defun decode-long-float (x)
416 (declare (long-float x))
417 (let* ((hi (long-float-high-bits x))
418 (lo (long-float-low-bits x))
419 (exp-bits (long-float-exp-bits x))
420 (exp (ldb sb!vm:long-float-exponent-byte exp-bits))
421 (sign (if (minusp exp-bits) -1l0 1l0))
422 (biased (truly-the long-float-exponent
423 (- exp sb!vm:long-float-bias))))
424 (unless (<= exp sb!vm:long-float-normal-exponent-max)
425 (error "can't decode NaN or infinity: ~S" x))
426 (cond ((zerop x)
427 (values 0.0l0 biased sign))
428 ((< exp sb!vm:long-float-normal-exponent-min)
429 (decode-long-denorm x))
431 (values (make-long-float
432 (dpb sb!vm:long-float-bias sb!vm:long-float-exponent-byte
433 exp-bits)
436 biased sign)))))
438 ;;; Dispatch to the appropriate type-specific function.
439 (defun decode-float (f)
440 #!+sb-doc
441 "Return three values:
442 1) a floating-point number representing the significand. This is always
443 between 0.5 (inclusive) and 1.0 (exclusive).
444 2) an integer representing the exponent.
445 3) -1.0 or 1.0 (i.e. the sign of the argument.)"
446 (number-dispatch ((f float))
447 ((single-float)
448 (decode-single-float f))
449 ((double-float)
450 (decode-double-float f))
451 #!+long-float
452 ((long-float)
453 (decode-long-float f))))
455 ;;;; SCALE-FLOAT
457 #!-sb-fluid (declaim (maybe-inline scale-single-float scale-double-float))
459 ;;; Handle float scaling where the X is denormalized or the result is
460 ;;; denormalized or underflows to 0.
461 (defun scale-float-maybe-underflow (x exp)
462 (multiple-value-bind (sig old-exp) (integer-decode-float x)
463 (let* ((digits (float-digits x))
464 (new-exp (+ exp old-exp digits
465 (etypecase x
466 (single-float sb!vm:single-float-bias)
467 (double-float sb!vm:double-float-bias))))
468 (sign (if (minusp (float-sign x)) 1 0)))
469 (cond
470 ((< new-exp
471 (etypecase x
472 (single-float sb!vm:single-float-normal-exponent-min)
473 (double-float sb!vm:double-float-normal-exponent-min)))
474 (when (sb!vm:current-float-trap :inexact)
475 (error 'floating-point-inexact :operation 'scale-float
476 :operands (list x exp)))
477 (when (sb!vm:current-float-trap :underflow)
478 (error 'floating-point-underflow :operation 'scale-float
479 :operands (list x exp)))
480 (let ((shift (1- new-exp)))
481 (if (< shift (- (1- digits)))
482 (float-sign x 0.0)
483 (etypecase x
484 (single-float (single-from-bits sign 0 (ash sig shift)))
485 (double-float (double-from-bits sign 0 (ash sig shift)))))))
487 (etypecase x
488 (single-float (single-from-bits sign new-exp sig))
489 (double-float (double-from-bits sign new-exp sig))))))))
491 ;;; Called when scaling a float overflows, or the original float was a
492 ;;; NaN or infinity. If overflow errors are trapped, then error,
493 ;;; otherwise return the appropriate infinity. If a NaN, signal or not
494 ;;; as appropriate.
495 (defun scale-float-maybe-overflow (x exp)
496 (cond
497 ((float-infinity-p x)
498 ;; Infinity is infinity, no matter how small...
500 ((float-nan-p x)
501 (when (and (float-trapping-nan-p x)
502 (sb!vm:current-float-trap :invalid))
503 (error 'floating-point-invalid-operation :operation 'scale-float
504 :operands (list x exp)))
507 (when (sb!vm:current-float-trap :overflow)
508 (error 'floating-point-overflow :operation 'scale-float
509 :operands (list x exp)))
510 (when (sb!vm:current-float-trap :inexact)
511 (error 'floating-point-inexact :operation 'scale-float
512 :operands (list x exp)))
513 (* (float-sign x)
514 (etypecase x
515 (single-float
516 ;; SINGLE-FLOAT-POSITIVE-INFINITY
517 (single-from-bits 0 (1+ sb!vm:single-float-normal-exponent-max) 0))
518 (double-float
519 ;; DOUBLE-FLOAT-POSITIVE-INFINITY
520 (double-from-bits 0 (1+ sb!vm:double-float-normal-exponent-max) 0)))))))
522 ;;; Scale a single or double float, calling the correct over/underflow
523 ;;; functions.
524 (defun scale-single-float (x exp)
525 (declare (single-float x) (integer exp))
526 (etypecase exp
527 (fixnum
528 (let* ((bits (single-float-bits x))
529 (old-exp (ldb sb!vm:single-float-exponent-byte bits))
530 (new-exp (+ old-exp exp)))
531 (cond
532 ((zerop x) x)
533 ((or (< old-exp sb!vm:single-float-normal-exponent-min)
534 (< new-exp sb!vm:single-float-normal-exponent-min))
535 (scale-float-maybe-underflow x exp))
536 ((or (> old-exp sb!vm:single-float-normal-exponent-max)
537 (> new-exp sb!vm:single-float-normal-exponent-max))
538 (scale-float-maybe-overflow x exp))
540 (make-single-float (dpb new-exp
541 sb!vm:single-float-exponent-byte
542 bits))))))
543 (unsigned-byte (scale-float-maybe-overflow x exp))
544 ((integer * 0) (scale-float-maybe-underflow x exp))))
545 (defun scale-double-float (x exp)
546 (declare (double-float x) (integer exp))
547 (etypecase exp
548 (fixnum
549 (let* ((hi (double-float-high-bits x))
550 (lo (double-float-low-bits x))
551 (old-exp (ldb sb!vm:double-float-exponent-byte hi))
552 (new-exp (+ old-exp exp)))
553 (cond
554 ((zerop x) x)
555 ((or (< old-exp sb!vm:double-float-normal-exponent-min)
556 (< new-exp sb!vm:double-float-normal-exponent-min))
557 (scale-float-maybe-underflow x exp))
558 ((or (> old-exp sb!vm:double-float-normal-exponent-max)
559 (> new-exp sb!vm:double-float-normal-exponent-max))
560 (scale-float-maybe-overflow x exp))
562 (make-double-float (dpb new-exp sb!vm:double-float-exponent-byte hi)
563 lo)))))
564 (unsigned-byte (scale-float-maybe-overflow x exp))
565 ((integer * 0) (scale-float-maybe-underflow x exp))))
567 #!+(and x86 long-float)
568 (defun scale-long-float (x exp)
569 (declare (long-float x) (integer exp))
570 (scale-float x exp))
572 ;;; Dispatch to the correct type-specific scale-float function.
573 (defun scale-float (f ex)
574 #!+sb-doc
575 "Return the value (* f (expt (float 2 f) ex)), but with no unnecessary loss
576 of precision or overflow."
577 (number-dispatch ((f float))
578 ((single-float)
579 (scale-single-float f ex))
580 ((double-float)
581 (scale-double-float f ex))
582 #!+long-float
583 ((long-float)
584 (scale-long-float f ex))))
586 ;;;; converting to/from floats
588 (defun float (number &optional (other () otherp))
589 #!+sb-doc
590 "Converts any REAL to a float. If OTHER is not provided, it returns a
591 SINGLE-FLOAT if NUMBER is not already a FLOAT. If OTHER is provided, the
592 result is the same float format as OTHER."
593 (if otherp
594 (number-dispatch ((number real) (other float))
595 (((foreach rational single-float double-float #!+long-float long-float)
596 (foreach single-float double-float #!+long-float long-float))
597 (coerce number '(dispatch-type other))))
598 (if (floatp number)
599 number
600 (coerce number 'single-float))))
602 (macrolet ((frob (name type)
603 `(defun ,name (x)
604 (number-dispatch ((x real))
605 (((foreach single-float double-float #!+long-float long-float
606 fixnum))
607 (coerce x ',type))
608 ((bignum)
609 (bignum-to-float x ',type))
610 ((ratio)
611 (float-ratio x ',type))))))
612 (frob %single-float single-float)
613 (frob %double-float double-float)
614 #!+long-float
615 (frob %long-float long-float))
617 ;;; Convert a ratio to a float. We avoid any rounding error by doing an
618 ;;; integer division. Accuracy is important to preserve read/print
619 ;;; consistency, since this is ultimately how the reader reads a float. We
620 ;;; scale the numerator by a power of two until the division results in the
621 ;;; desired number of fraction bits, then do round-to-nearest.
622 (defun float-ratio (x format)
623 (let* ((signed-num (numerator x))
624 (plusp (plusp signed-num))
625 (num (if plusp signed-num (- signed-num)))
626 (den (denominator x))
627 (digits (float-format-digits format))
628 (scale 0))
629 (declare (fixnum digits scale))
630 ;; Strip any trailing zeros from the denominator and move it into the scale
631 ;; factor (to minimize the size of the operands.)
632 (let ((den-twos (1- (integer-length (logxor den (1- den))))))
633 (declare (fixnum den-twos))
634 (decf scale den-twos)
635 (setq den (ash den (- den-twos))))
636 ;; Guess how much we need to scale by from the magnitudes of the numerator
637 ;; and denominator. We want one extra bit for a guard bit.
638 (let* ((num-len (integer-length num))
639 (den-len (integer-length den))
640 (delta (- den-len num-len))
641 (shift (1+ (the fixnum (+ delta digits))))
642 (shifted-num (ash num shift)))
643 (declare (fixnum delta shift))
644 (decf scale delta)
645 (labels ((float-and-scale (bits)
646 (let* ((bits (ash bits -1))
647 (len (integer-length bits)))
648 (cond ((> len digits)
649 (aver (= len (the fixnum (1+ digits))))
650 (scale-float (floatit (ash bits -1)) (1+ scale)))
652 (scale-float (floatit bits) scale)))))
653 (floatit (bits)
654 (let ((sign (if plusp 0 1)))
655 (case format
656 (single-float
657 (single-from-bits sign sb!vm:single-float-bias bits))
658 (double-float
659 (double-from-bits sign sb!vm:double-float-bias bits))
660 #!+long-float
661 (long-float
662 (long-from-bits sign sb!vm:long-float-bias bits))))))
663 (loop
664 (multiple-value-bind (fraction-and-guard rem)
665 (truncate shifted-num den)
666 (let ((extra (- (integer-length fraction-and-guard) digits)))
667 (declare (fixnum extra))
668 (cond ((/= extra 1)
669 (aver (> extra 1)))
670 ((oddp fraction-and-guard)
671 (return
672 (if (zerop rem)
673 (float-and-scale
674 (if (zerop (logand fraction-and-guard 2))
675 fraction-and-guard
676 (1+ fraction-and-guard)))
677 (float-and-scale (1+ fraction-and-guard)))))
679 (return (float-and-scale fraction-and-guard)))))
680 (setq shifted-num (ash shifted-num -1))
681 (incf scale)))))))
684 These might be useful if we ever have a machine without float/integer
685 conversion hardware. For now, we'll use special ops that
686 uninterruptibly frob the rounding modes & do ieee round-to-integer.
688 ;;; The compiler compiles a call to this when we are doing %UNARY-TRUNCATE
689 ;;; and the result is known to be a fixnum. We can avoid some generic
690 ;;; arithmetic in this case.
691 (defun %unary-truncate-single-float/fixnum (x)
692 (declare (single-float x) (values fixnum))
693 (locally (declare (optimize (speed 3) (safety 0)))
694 (let* ((bits (single-float-bits x))
695 (exp (ldb sb!vm:single-float-exponent-byte bits))
696 (frac (logior (ldb sb!vm:single-float-significand-byte bits)
697 sb!vm:single-float-hidden-bit))
698 (shift (- exp sb!vm:single-float-digits sb!vm:single-float-bias)))
699 (when (> exp sb!vm:single-float-normal-exponent-max)
700 (error 'floating-point-invalid-operation :operator 'truncate
701 :operands (list x)))
702 (if (<= shift (- sb!vm:single-float-digits))
704 (let ((res (ash frac shift)))
705 (declare (type (unsigned-byte 31) res))
706 (if (minusp bits)
707 (- res)
708 res))))))
710 ;;; Double-float version of this operation (see above single op).
711 (defun %unary-truncate-double-float/fixnum (x)
712 (declare (double-float x) (values fixnum))
713 (locally (declare (optimize (speed 3) (safety 0)))
714 (let* ((hi-bits (double-float-high-bits x))
715 (exp (ldb sb!vm:double-float-exponent-byte hi-bits))
716 (frac (logior (ldb sb!vm:double-float-significand-byte hi-bits)
717 sb!vm:double-float-hidden-bit))
718 (shift (- exp (- sb!vm:double-float-digits sb!vm:n-word-bits)
719 sb!vm:double-float-bias)))
720 (when (> exp sb!vm:double-float-normal-exponent-max)
721 (error 'floating-point-invalid-operation :operator 'truncate
722 :operands (list x)))
723 (if (<= shift (- sb!vm:n-word-bits sb!vm:double-float-digits))
725 (let* ((res-hi (ash frac shift))
726 (res (if (plusp shift)
727 (logior res-hi
728 (the fixnum
729 (ash (double-float-low-bits x)
730 (- shift sb!vm:n-word-bits))))
731 res-hi)))
732 (declare (type (unsigned-byte 31) res-hi res))
733 (if (minusp hi-bits)
734 (- res)
735 res))))))
738 ;;; This function is called when we are doing a truncate without any funky
739 ;;; divisor, i.e. converting a float or ratio to an integer. Note that we do
740 ;;; *not* return the second value of truncate, so it must be computed by the
741 ;;; caller if needed.
743 ;;; In the float case, we pick off small arguments so that compiler can use
744 ;;; special-case operations. We use an exclusive test, since (due to round-off
745 ;;; error), (float most-positive-fixnum) may be greater than
746 ;;; most-positive-fixnum.
747 (defun %unary-truncate (number)
748 (number-dispatch ((number real))
749 ((integer) number)
750 ((ratio) (values (truncate (numerator number) (denominator number))))
751 (((foreach single-float double-float #!+long-float long-float))
752 (if (< (float most-negative-fixnum number)
753 number
754 (float most-positive-fixnum number))
755 (truly-the fixnum (%unary-truncate number))
756 (multiple-value-bind (bits exp) (integer-decode-float number)
757 (let ((res (ash bits exp)))
758 (if (minusp number)
759 (- res)
760 res)))))))
762 ;;; Similar to %UNARY-TRUNCATE, but rounds to the nearest integer. If we
763 ;;; can't use the round primitive, then we do our own round-to-nearest on the
764 ;;; result of i-d-f. [Note that this rounding will really only happen with
765 ;;; double floats, since the whole single-float fraction will fit in a fixnum,
766 ;;; so all single-floats larger than most-positive-fixnum can be precisely
767 ;;; represented by an integer.]
768 (defun %unary-round (number)
769 (number-dispatch ((number real))
770 ((integer) number)
771 ((ratio) (values (round (numerator number) (denominator number))))
772 (((foreach single-float double-float #!+long-float long-float))
773 (if (< (float most-negative-fixnum number)
774 number
775 (float most-positive-fixnum number))
776 (truly-the fixnum (%unary-round number))
777 (multiple-value-bind (bits exp) (integer-decode-float number)
778 (let* ((shifted (ash bits exp))
779 (rounded (if (and (minusp exp)
780 (oddp shifted)
781 (eql (logand bits
782 (lognot (ash -1 (- exp))))
783 (ash 1 (- -1 exp))))
784 (1+ shifted)
785 shifted)))
786 (if (minusp number)
787 (- rounded)
788 rounded)))))))
790 (defun %unary-ftruncate (number)
791 (number-dispatch ((number real))
792 ((integer) (float number))
793 ((ratio) (float (truncate (numerator number) (denominator number))))
794 (((foreach single-float double-float #!+long-float long-float))
795 (%unary-ftruncate number))))
797 (defun rational (x)
798 #!+sb-doc
799 "RATIONAL produces a rational number for any real numeric argument. This is
800 more efficient than RATIONALIZE, but it assumes that floating-point is
801 completely accurate, giving a result that isn't as pretty."
802 (number-dispatch ((x real))
803 (((foreach single-float double-float #!+long-float long-float))
804 (multiple-value-bind (bits exp) (integer-decode-float x)
805 (if (eql bits 0)
807 (let* ((int (if (minusp x) (- bits) bits))
808 (digits (float-digits x))
809 (ex (+ exp digits)))
810 (if (minusp ex)
811 (integer-/-integer int (ash 1 (+ digits (- ex))))
812 (integer-/-integer (ash int ex) (ash 1 digits)))))))
813 ((rational) x)))
815 ;;; This algorithm for RATIONALIZE, due to Bruno Haible, is included
816 ;;; with permission.
818 ;;; Algorithm (recursively presented):
819 ;;; If x is a rational number, return x.
820 ;;; If x = 0.0, return 0.
821 ;;; If x < 0.0, return (- (rationalize (- x))).
822 ;;; If x > 0.0:
823 ;;; Call (integer-decode-float x). It returns a m,e,s=1 (mantissa,
824 ;;; exponent, sign).
825 ;;; If m = 0 or e >= 0: return x = m*2^e.
826 ;;; Search a rational number between a = (m-1/2)*2^e and b = (m+1/2)*2^e
827 ;;; with smallest possible numerator and denominator.
828 ;;; Note 1: If m is a power of 2, we ought to take a = (m-1/4)*2^e.
829 ;;; But in this case the result will be x itself anyway, regardless of
830 ;;; the choice of a. Therefore we can simply ignore this case.
831 ;;; Note 2: At first, we need to consider the closed interval [a,b].
832 ;;; but since a and b have the denominator 2^(|e|+1) whereas x itself
833 ;;; has a denominator <= 2^|e|, we can restrict the seach to the open
834 ;;; interval (a,b).
835 ;;; So, for given a and b (0 < a < b) we are searching a rational number
836 ;;; y with a <= y <= b.
837 ;;; Recursive algorithm fraction_between(a,b):
838 ;;; c := (ceiling a)
839 ;;; if c < b
840 ;;; then return c ; because a <= c < b, c integer
841 ;;; else
842 ;;; ; a is not integer (otherwise we would have had c = a < b)
843 ;;; k := c-1 ; k = floor(a), k < a < b <= k+1
844 ;;; return y = k + 1/fraction_between(1/(b-k), 1/(a-k))
845 ;;; ; note 1 <= 1/(b-k) < 1/(a-k)
847 ;;; You can see that we are actually computing a continued fraction expansion.
849 ;;; Algorithm (iterative):
850 ;;; If x is rational, return x.
851 ;;; Call (integer-decode-float x). It returns a m,e,s (mantissa,
852 ;;; exponent, sign).
853 ;;; If m = 0 or e >= 0, return m*2^e*s. (This includes the case x = 0.0.)
854 ;;; Create rational numbers a := (2*m-1)*2^(e-1) and b := (2*m+1)*2^(e-1)
855 ;;; (positive and already in lowest terms because the denominator is a
856 ;;; power of two and the numerator is odd).
857 ;;; Start a continued fraction expansion
858 ;;; p[-1] := 0, p[0] := 1, q[-1] := 1, q[0] := 0, i := 0.
859 ;;; Loop
860 ;;; c := (ceiling a)
861 ;;; if c >= b
862 ;;; then k := c-1, partial_quotient(k), (a,b) := (1/(b-k),1/(a-k)),
863 ;;; goto Loop
864 ;;; finally partial_quotient(c).
865 ;;; Here partial_quotient(c) denotes the iteration
866 ;;; i := i+1, p[i] := c*p[i-1]+p[i-2], q[i] := c*q[i-1]+q[i-2].
867 ;;; At the end, return s * (p[i]/q[i]).
868 ;;; This rational number is already in lowest terms because
869 ;;; p[i]*q[i-1]-p[i-1]*q[i] = (-1)^i.
871 ;;; See also
872 ;;; Hardy, Wright: An introduction to number theory
873 ;;; and/or
874 ;;; <http://modular.fas.harvard.edu/edu/Fall2001/124/lectures/lecture17/lecture17/>
875 ;;; <http://modular.fas.harvard.edu/edu/Fall2001/124/lectures/lecture17/lecture18/>
877 (defun rationalize (x)
878 "Converts any REAL to a RATIONAL. Floats are converted to a simple rational
879 representation exploiting the assumption that floats are only accurate to
880 their precision. RATIONALIZE (and also RATIONAL) preserve the invariant:
881 (= x (float (rationalize x) x))"
882 (number-dispatch ((x real))
883 (((foreach single-float double-float #!+long-float long-float))
884 ;; This is a fairly straigtforward implementation of the
885 ;; iterative algorithm above.
886 (multiple-value-bind (frac expo sign)
887 (integer-decode-float x)
888 (cond ((or (zerop frac) (>= expo 0))
889 (if (minusp sign)
890 (- (ash frac expo))
891 (ash frac expo)))
893 ;; expo < 0 and (2*m-1) and (2*m+1) are coprime to 2^(1-e),
894 ;; so build the fraction up immediately, without having to do
895 ;; a gcd.
896 (let ((a (build-ratio (- (* 2 frac) 1) (ash 1 (- 1 expo))))
897 (b (build-ratio (+ (* 2 frac) 1) (ash 1 (- 1 expo))))
898 (p0 0)
899 (q0 1)
900 (p1 1)
901 (q1 0))
902 (do ((c (ceiling a) (ceiling a)))
903 ((< c b)
904 (let ((top (+ (* c p1) p0))
905 (bot (+ (* c q1) q0)))
906 (build-ratio (if (minusp sign)
907 (- top)
908 top)
909 bot)))
910 (let* ((k (- c 1))
911 (p2 (+ (* k p1) p0))
912 (q2 (+ (* k q1) q0)))
913 (psetf a (/ (- b k))
914 b (/ (- a k)))
915 (setf p0 p1
916 q0 q1
917 p1 p2
918 q1 q2))))))))
919 ((rational) x)))