{-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE PartialTypeSignatures #-} {-# OPTIONS_GHC -Wno-orphans #-} {-# OPTIONS_GHC -Wno-partial-type-signatures #-} {-| Module : AERN2.MP.Ball.Field Description : Field operations on arbitrary precision dyadic balls Copyright : (c) Michal Konecny License : BSD3 Maintainer : mikkonecny@gmail.com Stability : experimental Portability : portable Field operations on arbitrary precision dyadic balls -} module AERN2.MP.Ball.Field (mulBalls, mulByEndpoints) where import MixedTypesNumPrelude -- import qualified Prelude as P import qualified Numeric.CollectErrors as CN import AERN2.Normalize mulByEndpoints :: MPBall -> MPBall -> MPBall mulByEndpoints b1 b2 = fromEndpoints l r where (l,r) | 0 <= l1 && 0 <= l2 = (l1*.l2, r1*^r2) -- 0 <= l1 <= r1, 0 <= l2 <= r2 | r1 <= 0 && r2 <= 0 = (r1*.r2, l1*^l2) -- l1 <= r1 <= 0, l2 <= r2 <= 0 | 0 <= l1 && r2 <= 0 = (r1*.l2, l1*^r2) -- l2 <= r2 <= 0 <= l1 <= r1 | r1 <= 0 && 0 <= l2 = (l1*.r2, r1*^l2) -- l1 <= r1 <= 0 <= l2 <= r2 | l1 < 0 && 0 < r1 && 0 <= l2 = (l1*.r2, r1*^r2) -- l1 < 0 < r1, 0 <= l2 <= r2 | l1 < 0 && 0 < r1 && r2 <= 0 = (r1*.l2, l1*^l2) -- l1 < 0 < r1, l2 <= r2 <= 0 | l2 < 0 && 0 < r2 && 0 <= l1 = (l2*.r1, r2*^r1) -- l2 < 0 < r2, 0 <= l1 <= r1 | l2 < 0 && 0 < r2 && r1 <= 0 = (r2*.l1, l2*^l1) -- l2 < 0 < r2, l1 <= r1 <= 0 | otherwise = -- l1 < 0 < r1, l2 < 0 < r2 ((l1 *. r2) `min` (r1 *. l2) ,(l1 *^ l2) `max` (r1 *^ r2)) (l1,r1) = endpoints b1 (l2,r2) = endpoints b2