Next: srfi comparators constructors pair, Previous: srfi comparators constructors general, Up: srfi comparators constructors [Index]
Return a comparator that compares inexact real numbers including NaNs as
follows: if after rounding to the nearest epsilon they are the
same, they compare equal; otherwise they compare as specified by
<
.
The direction of rounding is specified by the rounding argument,
which is either a procedure accepting two arguments (the number and
epsilon), or else one of the symbols floor
, ceiling
,
truncate
, or round
.
The value of epsilon is used by the generated comparator only if
rounding is a procedure: it is ignored if rounding is a
symbol. When epsilon is not #f
and rounding is a
symbol: this function raises a continuable exception with
compound condition object of types:
&inexact-real-comparator-with-unused-epsilon
,
&who
, &message
, &irritants
.
The argument nan-handling specifies how to compare NaN arguments to non–NaN arguments.
min
: NaN values precede all other values.
max
: NaN values follow all other values.
error
: an error is signalled if a NaN value
is compared by raising a non–continuable exception with compound
condition object of types: &who
, &message
,
&irritants
, &comparator-nan-comparison-error
.
Here is an example of comparator using the round
rounding mode
and the error
policy to compare +nan.0
:
#!vicare (import (vicare) (srfi :114)) (define-constant C (make-inexact-real-comparator #f 'round 'error)) ;; type test (comparator-test-type C 1.2) ⇒ #t (comparator-test-type C "ciao") ⇒ #f (comparator-test-type C 1+2i) ⇒ #f ;; type check (comparator-check-type C 1.2) ⇒ #t (try (comparator-check-type C (void)) (catch E ((&comparator-type-error) #t) (else #f))) ⇒ #t ;; comparison (comparator-compare C 1.2 1.2) ⇒ 0 (comparator-compare C 1.0 2.0) ⇒ -1 (comparator-compare C 2.0 1.0) ⇒ +1 (comparator-compare C +inf.0 +inf.0) ⇒ 0 (comparator-compare C -inf.0 -inf.0) ⇒ 0 (comparator-compare C -inf.0 +inf.0) ⇒ -1 (comparator-compare C +inf.0 -inf.0) ⇒ +1 (comparator-compare C +nan.0 +nan.0) ⇒ 0 (try (comparator-compare C +nan.0 1.0) (catch E ((&comparator-nan-comparison-error) #t) (else E))) ⇒ #t (try (comparator-compare C 1.0 +nan.0) (catch E ((&comparator-nan-comparison-error) #t) (else E))) ⇒ #t ;; comparison with rounding (comparator-compare C 1.04 1.0) ⇒ 0 (comparator-compare C 0.96 1.0) ⇒ 0 ;; hash (= (comparator-hash C 1.0) (comparator-hash C 1.04)) ⇒ #t (= (comparator-hash C 1.0) (comparator-hash C 0.96)) ⇒ #t (non-negative-exact-integer? (comparator-hash C +inf.0)) ⇒ #t (non-negative-exact-integer? (comparator-hash C -inf.0)) ⇒ #t (non-negative-exact-integer? (comparator-hash C +nan.0)) ⇒ #t
Here is an example of comparator that rounds to the nearest 0.1
and uses the min
policy to compare +nan.0
:
#!vicare (import (vicare) (srfi :114)) (define* (round-to-epsilon {R flonum?} {epsilon flonum?}) (infix round(R / epsilon) * epsilon)) (define-constant C (make-inexact-real-comparator 0.1 round-to-epsilon 'min)) ;; rounding to (round-to-epsilon 1.0 0.1) ⇒ 1.0 (round-to-epsilon 1.05 0.1) ⇒ 1.0 (round-to-epsilon 0.951 0.1) ⇒ 1.0 (round-to-epsilon 0.949 0.1) ⇒ 0.9 ;; type test (comparator-test-type C 1.2) ⇒ #t (comparator-test-type C +inf.0) ⇒ #t (comparator-test-type C -inf.0) ⇒ #t (comparator-test-type C -nan.0) ⇒ #t (comparator-test-type C "ciao") ⇒ #f (comparator-test-type C 1+2i) ⇒ #f ;; type check (comparator-check-type C 1.2) ⇒ #t (try (comparator-check-type C (void)) (catch E ((&comparator-type-error) #t) (else E))) ⇒ #t ;; comparison (comparator-compare C 1.2 1.2) ⇒ 0 (comparator-compare C 1.0 2.0) ⇒ -1 (comparator-compare C 2.0 1.0) ⇒ +1 (comparator-compare C +inf.0 +inf.0) ⇒ 0 (comparator-compare C -inf.0 -inf.0) ⇒ 0 (comparator-compare C -inf.0 +inf.0) ⇒ -1 (comparator-compare C +inf.0 -inf.0) ⇒ +1 (comparator-compare C +nan.0 +nan.0) ⇒ 0 (comparator-compare C +nan.0 1.0) ⇒ -1 (comparator-compare C 1.0 +nan.0) ⇒ +1 ;; comparison with rounding (comparator-compare C 1.04 1.0) ⇒ 0 (comparator-compare C 0.96 1.0) ⇒ 0 (comparator-compare C 0.951 1.0) ⇒ 0 (comparator-compare C 0.949 1.0) ⇒ -1 (comparator-compare C 0.949 0.9) ⇒ 0 ;; hash (= (comparator-hash C 1.0) (comparator-hash C 1.04)) ⇒ #t (= (comparator-hash C 1.0) (comparator-hash C 0.96)) ⇒ #t (= (comparator-hash C 1.0) (comparator-hash C 0.951)) ⇒ #t (= (comparator-hash C 1.04) (comparator-hash C 0.951)) ⇒ #t (non-negative-exact-integer? (comparator-hash C +inf.0)) ⇒ #t (non-negative-exact-integer? (comparator-hash C -inf.0)) ⇒ #t (non-negative-exact-integer? (comparator-hash C +nan.0)) ⇒ #t
Here is an example of comparator using the max
policy to compare
+nan.0
:
#!vicare (import (vicare) (srfi :114)) (define-constant C (make-inexact-real-comparator #f 'round 'max)) (comparator-compare C +nan.0 +nan.0) ⇒ 0 (comparator-compare C +nan.0 1.0) ⇒ +1 (comparator-compare C 1.0 +nan.0) ⇒ -1
Here is an example of comparator using a procedure as policy to compare
+nan.0
:
#!vicare (import (vicare) (srfi :114)) (define (nan-comparison other-R) ;;NaN is equal to any number. ;; 0) (define-constant C (make-inexact-real-comparator #f 'round nan-comparison)) (comparator-compare C +nan.0 +nan.0) ⇒ 0 (comparator-compare C +nan.0 +1.0) ⇒ 0 (comparator-compare C +1.0 +nan.0) ⇒ 0
Next: srfi comparators constructors pair, Previous: srfi comparators constructors general, Up: srfi comparators constructors [Index]