Skip to content
This repository was archived by the owner on Oct 4, 2020. It is now read-only.

Commit 27e1992

Browse files
authored
Merge pull request #33 from garyb/approxnum
Add ApproxNumber
2 parents 77837aa + ad99183 commit 27e1992

File tree

1 file changed

+47
-0
lines changed

1 file changed

+47
-0
lines changed
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
module Test.StrongCheck.Data.ApproxNumber where
2+
3+
import Prelude
4+
5+
import Test.StrongCheck.Arbitrary (class Coarbitrary, class Arbitrary, coarbitrary, arbitrary)
6+
7+
-- | A newtype for `Number` whose `Eq` instance uses an epsilon value to allow
8+
-- | for precision erros when comparing.
9+
newtype ApproxNumber = ApproxNumber Number
10+
11+
-- Approximate equality comparison
12+
approximateEqual :: Number -> Number -> Boolean
13+
approximateEqual x y = (y - x) <= epsilon && (y - x) >= (-epsilon)
14+
where
15+
epsilon = 0.00000001
16+
17+
infix 2 approximateEqual as =~=
18+
19+
instance arbitraryApproxNumber :: Arbitrary ApproxNumber where
20+
arbitrary = ApproxNumber <$> arbitrary
21+
22+
instance coarbitraryApproxNumber :: Coarbitrary ApproxNumber where
23+
coarbitrary (ApproxNumber n) = coarbitrary n
24+
25+
instance eqApproxNumber :: Eq ApproxNumber where
26+
eq (ApproxNumber x) (ApproxNumber y) = x =~= y
27+
28+
instance ordApproxNumber :: Ord ApproxNumber where
29+
compare (ApproxNumber x) (ApproxNumber y) = compare x y
30+
31+
instance semiringApproxNumber :: Semiring ApproxNumber where
32+
add (ApproxNumber x) (ApproxNumber y) = ApproxNumber (x + y)
33+
zero = ApproxNumber zero
34+
mul (ApproxNumber x) (ApproxNumber y) = ApproxNumber (x * y)
35+
one = ApproxNumber one
36+
37+
instance ringApproxNumber :: Ring ApproxNumber where
38+
sub (ApproxNumber x) (ApproxNumber y) = ApproxNumber (x - y)
39+
40+
instance commutativeRingApproxNumber :: CommutativeRing ApproxNumber
41+
42+
instance euclideanRingApproxNumber :: EuclideanRing ApproxNumber where
43+
degree (ApproxNumber x) = degree x
44+
div (ApproxNumber x) (ApproxNumber y) = ApproxNumber (x / y)
45+
mod (ApproxNumber x) (ApproxNumber y) = ApproxNumber (x `mod` y)
46+
47+
instance fieldApproxNumber :: Field ApproxNumber

0 commit comments

Comments
 (0)