Skip to content

Commit 2f640ee

Browse files
voodo magic!
1 parent e28b443 commit 2f640ee

File tree

1 file changed

+35
-3
lines changed

1 file changed

+35
-3
lines changed

src/Constrained/NumOrd.hs

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -759,15 +759,47 @@ instance HasDivision Float where
759759
| otherwise = NumSpecInterval mu' ml'
760760
ml' = adjustLowerBound <$> ml
761761
mu' = adjustUpperBound <$> mu
762-
adjustLowerBound l = l / a
762+
adjustLowerBound l =
763+
let r = l / a
764+
l' = r * a
765+
in
766+
if l' < l
767+
then r + (l - l') * 2 * signum a
768+
else r
763769

764-
adjustUpperBound u = u / a
770+
adjustUpperBound u =
771+
let r = u / a
772+
u' = r * a
773+
in
774+
if u < u'
775+
then r - (u' - u) * 2 * signum a
776+
else r
765777

766778
instance HasDivision Double where
767779
doDivide = (/)
768780

769781
divideSpec 0 _ = TrueSpec
770-
divideSpec a (NumSpecInterval ml mu) = typeSpec $ NumSpecInterval ((/a) <$> ml) ((/a) <$> mu)
782+
divideSpec a (NumSpecInterval ml mu) = typeSpec ts
783+
where
784+
ts | a > 0 = NumSpecInterval ml' mu'
785+
| otherwise = NumSpecInterval mu' ml'
786+
ml' = adjustLowerBound <$> ml
787+
mu' = adjustUpperBound <$> mu
788+
adjustLowerBound l =
789+
let r = l / a
790+
l' = r * a
791+
in
792+
if l' < l
793+
then r + (l - l') * 2 * signum a
794+
else r
795+
796+
adjustUpperBound u =
797+
let r = u / a
798+
u' = r * a
799+
in
800+
if u < u'
801+
then r - (u' - u) * 2 * signum a
802+
else r
771803

772804
-- | A type that we can reason numerically about in constraints
773805
type Numeric a = (HasSpec a, Ord a, Num a, TypeSpec a ~ NumSpec a, MaybeBounded a, HasDivision a)

0 commit comments

Comments
 (0)