--- numbers.test.~1.5.4.3.~ 2002-05-17 02:48:02.000000000 +1000
+++ numbers.test 2004-04-23 18:22:58.000000000 +1000
@@ -1,5 +1,5 @@
;;;; numbers.test --- tests guile's numbers -*- scheme -*-
-;;;; Copyright (C) 2000, 2001 Free Software Foundation, Inc.
+;;;; Copyright (C) 2000, 2001, 2004 Free Software Foundation, Inc.
;;;;
;;;; This program is free software; you can redistribute it and/or modify
;;;; it under the terms of the GNU General Public License as published by
@@ -1274,10 +1274,147 @@
;;; truncate
;;;
+(with-test-prefix "truncate"
+ (with-test-prefix "inum"
+ (pass-if "0"
+ (and (= 0 (truncate 0))
+ (exact? (truncate 0))))
+
+ (pass-if "1"
+ (and (= 1 (truncate 1))
+ (exact? (truncate 1))))
+
+ (pass-if "-1"
+ (and (= -1 (truncate -1))
+ (exact? (truncate -1)))))
+
+ (with-test-prefix "bignum"
+ (let ((x (1+ most-positive-fixnum)))
+ (pass-if "(1+ most-positive-fixnum)"
+ (and (= x (truncate x))
+ (exact? (truncate x)))))
+
+ (let ((x (1- most-negative-fixnum)))
+ (pass-if "(1- most-negative-fixnum)"
+ (and (= x (truncate x))
+ (exact? (truncate x))))))
+
+ (with-test-prefix "real"
+ (pass-if "0.0"
+ (and (= 0.0 (truncate 0.0))
+ (inexact? (truncate 0.0))))
+
+ (pass-if "1.0"
+ (and (= 1.0 (truncate 1.0))
+ (inexact? (truncate 1.0))))
+
+ (pass-if "-1.0"
+ (and (= -1.0 (truncate -1.0))
+ (inexact? (truncate -1.0))))
+
+ (pass-if "3.9"
+ (and (= 3.0 (truncate 3.9))
+ (inexact? (truncate 3.9))))
+
+ (pass-if "-3.9"
+ (and (= -3.0 (truncate -3.9))
+ (inexact? (truncate -3.9))))))
+
;;;
;;; round
;;;
+(with-test-prefix "round"
+ (with-test-prefix "inum"
+ (pass-if "0"
+ (and (= 0 (round 0))
+ (exact? (round 0))))
+
+ (pass-if "1"
+ (and (= 1 (round 1))
+ (exact? (round 1))))
+
+ (pass-if "-1"
+ (and (= -1 (round -1))
+ (exact? (round -1)))))
+
+ (with-test-prefix "bignum"
+ (let ((x (1+ most-positive-fixnum)))
+ (pass-if "(1+ most-positive-fixnum)"
+ (and (= x (round x))
+ (exact? (round x)))))
+
+ (let ((x (1- most-negative-fixnum)))
+ (pass-if "(1- most-negative-fixnum)"
+ (and (= x (round x))
+ (exact? (round x))))))
+
+ (with-test-prefix "real"
+ (pass-if "0.0"
+ (and (= 0.0 (round 0.0))
+ (inexact? (round 0.0))))
+
+ (pass-if "1.0"
+ (and (= 1.0 (round 1.0))
+ (inexact? (round 1.0))))
+
+ (pass-if "-1.0"
+ (and (= -1.0 (round -1.0))
+ (inexact? (round -1.0))))
+
+ (pass-if "-3.1"
+ (and (= -3.0 (round -3.1))
+ (inexact? (round -3.1))))
+
+ (pass-if "3.1"
+ (and (= 3.0 (round 3.1))
+ (inexact? (round 3.1))))
+
+ (pass-if "3.9"
+ (and (= 4.0 (round 3.9))
+ (inexact? (round 3.9))))
+
+ (pass-if "-3.9"
+ (and (= -4.0 (round -3.9))
+ (inexact? (round -3.9))))
+
+ (pass-if "1.5"
+ (and (= 2.0 (round 1.5))
+ (inexact? (round 1.5))))
+
+ (pass-if "2.5"
+ (and (= 2.0 (round 2.5))
+ (inexact? (round 2.5))))
+
+ (pass-if "3.5"
+ (and (= 4.0 (round 3.5))
+ (inexact? (round 3.5))))
+
+ (pass-if "-1.5"
+ (and (= -2.0 (round -1.5))
+ (inexact? (round -1.5))))
+
+ (pass-if "-2.5"
+ (and (= -2.0 (round -2.5))
+ (inexact? (round -2.5))))
+
+ (pass-if "-3.5"
+ (and (= -4.0 (round -3.5))
+ (inexact? (round -3.5))))
+
+ ;; prior to guile 1.6.5, on an IEEE system an inexact 2^53-1 (ie. a
+ ;; float with mantissa all ones) came out as 2^53 from `round' (except
+ ;; on i386 and m68k systems using the coprocessor and optimizing, where
+ ;; extra precision hid the problem)
+ (pass-if "2^53-1"
+ (let ((x (exact->inexact (1- (ash 1 53)))))
+ (and (= x (round x))
+ (inexact? (round x)))))
+ (pass-if "-(2^53-1)"
+ (let ((x (exact->inexact (- (1- (ash 1 53))))))
+ (and (= x (round x))
+ (inexact? (round x)))))))
+
;;;
;;; exact->inexact
;;;
@@ -1286,10 +1423,102 @@
;;; floor
;;;
+(with-test-prefix "floor"
+ (with-test-prefix "inum"
+ (pass-if "0"
+ (and (= 0 (floor 0))
+ (exact? (floor 0))))
+
+ (pass-if "1"
+ (and (= 1 (floor 1))
+ (exact? (floor 1))))
+
+ (pass-if "-1"
+ (and (= -1 (floor -1))
+ (exact? (floor -1)))))
+
+ (with-test-prefix "bignum"
+ (let ((x (1+ most-positive-fixnum)))
+ (pass-if "(1+ most-positive-fixnum)"
+ (and (= x (floor x))
+ (exact? (floor x)))))
+
+ (let ((x (1- most-negative-fixnum)))
+ (pass-if "(1- most-negative-fixnum)"
+ (and (= x (floor x))
+ (exact? (floor x))))))
+
+ (with-test-prefix "real"
+ (pass-if "0.0"
+ (and (= 0.0 (floor 0.0))
+ (inexact? (floor 0.0))))
+
+ (pass-if "1.0"
+ (and (= 1.0 (floor 1.0))
+ (inexact? (floor 1.0))))
+
+ (pass-if "-1.0"
+ (and (= -1.0 (floor -1.0))
+ (inexact? (floor -1.0))))
+
+ (pass-if "3.9"
+ (and (= 3.0 (floor 3.9))
+ (inexact? (floor 3.9))))
+
+ (pass-if "-3.9"
+ (and (= -4.0 (floor -3.9))
+ (inexact? (floor -3.9))))))
+
;;;
;;; ceiling
;;;
+(with-test-prefix "ceiling"
+ (with-test-prefix "inum"
+ (pass-if "0"
+ (and (= 0 (ceiling 0))
+ (exact? (ceiling 0))))
+
+ (pass-if "1"
+ (and (= 1 (ceiling 1))
+ (exact? (ceiling 1))))
+
+ (pass-if "-1"
+ (and (= -1 (ceiling -1))
+ (exact? (ceiling -1)))))
+
+ (with-test-prefix "bignum"
+ (let ((x (1+ most-positive-fixnum)))
+ (pass-if "(1+ most-positive-fixnum)"
+ (and (= x (ceiling x))
+ (exact? (ceiling x)))))
+
+ (let ((x (1- most-negative-fixnum)))
+ (pass-if "(1- most-negative-fixnum)"
+ (and (= x (ceiling x))
+ (exact? (ceiling x))))))
+
+ (with-test-prefix "real"
+ (pass-if "0.0"
+ (and (= 0.0 (ceiling 0.0))
+ (inexact? (ceiling 0.0))))
+
+ (pass-if "1.0"
+ (and (= 1.0 (ceiling 1.0))
+ (inexact? (ceiling 1.0))))
+
+ (pass-if "-1.0"
+ (and (= -1.0 (ceiling -1.0))
+ (inexact? (ceiling -1.0))))
+
+ (pass-if "3.9"
+ (and (= 4.0 (ceiling 3.9))
+ (inexact? (ceiling 3.9))))
+
+ (pass-if "-3.9"
+ (and (= -3.0 (ceiling -3.9))
+ (inexact? (ceiling -3.9))))))
+
;;;
;;; sqrt
;;;