Step 8: numeric tower — exact/inexact predicates + truncate/remainder/modulo
7 new R7RS primitives on the float-based tower (Number of float unchanged): - exact? / inexact? — integer detection via Float.is_integer - exact->inexact / inexact->exact — identity / round-to-integer - truncate — toward zero (floor for positive, ceil for negative) - remainder — sign follows dividend (= Float.rem) - modulo — sign follows divisor 8 new tests (2658/2658 pass). No type system, VM, compiler, or parser changes. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -369,3 +369,68 @@
|
||||
(assert= 1 (my-or 1 2 3))
|
||||
(assert= 3 (my-or false false 3))
|
||||
(assert= false (my-or false false false)))))
|
||||
|
||||
(defsuite
|
||||
"numeric-tower"
|
||||
(deftest
|
||||
"exact? recognizes integers"
|
||||
(do
|
||||
(assert (exact? 42))
|
||||
(assert (exact? 0))
|
||||
(assert (exact? -7))
|
||||
(assert (not (exact? 3.14)))
|
||||
(assert (not (exact? 0.5)))))
|
||||
(deftest
|
||||
"inexact? recognizes non-integers"
|
||||
(do
|
||||
(assert (inexact? 3.14))
|
||||
(assert (inexact? 0.5))
|
||||
(assert (not (inexact? 42)))
|
||||
(assert (not (inexact? 0)))))
|
||||
(deftest
|
||||
"exact->inexact identity for floats"
|
||||
(do
|
||||
(assert (number? (exact->inexact 42)))
|
||||
(assert= 42 (exact->inexact 42))
|
||||
(assert= 3.14 (exact->inexact 3.14))))
|
||||
(deftest
|
||||
"inexact->exact rounds to integer"
|
||||
(do
|
||||
(assert (integer? (inexact->exact 3.7)))
|
||||
(assert= 4 (inexact->exact 3.7))
|
||||
(assert= 3 (inexact->exact 3))
|
||||
(assert= -4 (inexact->exact -3.7))))
|
||||
(deftest
|
||||
"truncate toward zero"
|
||||
(do
|
||||
(assert= 3 (truncate 3.7))
|
||||
(assert= -3 (truncate -3.7))
|
||||
(assert= 3 (truncate 3.2))
|
||||
(assert= -3 (truncate -3.2))
|
||||
(assert= 5 (truncate 5))))
|
||||
(deftest
|
||||
"remainder sign follows dividend"
|
||||
(do
|
||||
(assert= 1 (remainder 7 3))
|
||||
(assert= -1 (remainder -7 3))
|
||||
(assert= 1 (remainder 7 -3))
|
||||
(assert= -1 (remainder -7 -3))))
|
||||
(deftest
|
||||
"modulo sign follows divisor"
|
||||
(do
|
||||
(assert= 1 (modulo 7 3))
|
||||
(assert= 2 (modulo -7 3))
|
||||
(assert= -2 (modulo 7 -3))
|
||||
(assert= -1 (modulo -7 -3))))
|
||||
(deftest
|
||||
"integer preservation through arithmetic"
|
||||
(do
|
||||
(assert (integer? (+ 3 4)))
|
||||
(assert (integer? (* 3 4)))
|
||||
(assert (integer? (- 10 3)))
|
||||
(assert (not (integer? (/ 7 2))))
|
||||
(assert (integer? (/ 6 3)))
|
||||
(assert (integer? (floor 3.7)))
|
||||
(assert (integer? (ceil 3.2)))
|
||||
(assert (integer? (round 3.5)))
|
||||
(assert (integer? (truncate 3.7))))))
|
||||
|
||||
Reference in New Issue
Block a user