diff --git a/aern2-mp.cabal b/aern2-mp.cabal
--- a/aern2-mp.cabal
+++ b/aern2-mp.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 3a6ca9d8026d093f51e3a0bb5c6a09c0a4cb008c15b8d398d4fc46d44591a13a
+-- hash: 59805057da90f7bf5d2552756df7e049bc228e506b006e1fb8357f26c3efb204
 
 name:           aern2-mp
-version:        0.2.3.0
+version:        0.2.4.0
 synopsis:       Multi-precision ball (interval) arithmetic
 description:    Please see the README on GitHub at <https://github.com/michalkonecny/aern2/#readme>
 category:       Math
@@ -84,7 +84,7 @@
     , deepseq
     , hspec
     , integer-logarithms
-    , mixed-types-num >=0.5.4
+    , mixed-types-num >=0.5.5
     , reflection
     , regex-tdfa
     , template-haskell
@@ -124,7 +124,7 @@
     , deepseq
     , hspec
     , integer-logarithms
-    , mixed-types-num >=0.5.4
+    , mixed-types-num >=0.5.5
     , reflection
     , regex-tdfa
     , template-haskell
diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,5 +1,7 @@
 # Change log for aern2-mp
 
+* v 0.2.4 2021-05-26
+  * use endpoint multiplication in integer power to avoid crossing 0
 * v 0.2.3 2021-05-22
   * make MPBall "Very inaccurate" a *potential* error (important for CReal accuracy queries)
 * v 0.2.2 2021-05-21
diff --git a/src/AERN2/MP/Ball/Elementary.hs b/src/AERN2/MP/Ball/Elementary.hs
--- a/src/AERN2/MP/Ball/Elementary.hs
+++ b/src/AERN2/MP/Ball/Elementary.hs
@@ -37,7 +37,7 @@
 import AERN2.MP.Ball.Type
 import AERN2.MP.Ball.Conversions ()
 import AERN2.MP.Ball.Comparisons ()
-import AERN2.MP.Ball.Field ()
+import AERN2.MP.Ball.Field (mulByEndpoints)
 
 
 {- trigonometrics -}
@@ -112,13 +112,13 @@
     logLip y = errorBound $ (1/y)
 
 instance CanPow MPBall MPBall where
-  pow = powUsingExpLog (mpBall 1)
+  pow = powUsingExpLog (mpBall 1) mulByEndpoints recip
 
 instance CanPow MPBall Dyadic where
-  pow b e = powUsingExpLog (mpBall 1) b (mpBall e)
+  pow b e = pow b (mpBall e)
 
 instance CanPow MPBall Rational where
-  pow b e = powUsingExpLog (mpBall 1) b (mpBallP (getPrecision b) e)
+  pow b e = pow b (mpBallP (getPrecision b) e)
 
 instance CanSqrt MPBall where
   type SqrtType MPBall = MPBall
diff --git a/src/AERN2/MP/Ball/Field.hs b/src/AERN2/MP/Ball/Field.hs
--- a/src/AERN2/MP/Ball/Field.hs
+++ b/src/AERN2/MP/Ball/Field.hs
@@ -15,7 +15,7 @@
     Field operations on arbitrary precision dyadic balls
 -}
 module AERN2.MP.Ball.Field
-()
+(mulBalls, mulByEndpoints)
 where
 
 import MixedTypesNumPrelude
@@ -124,13 +124,37 @@
 {- multiplication -}
 
 instance CanMulAsymmetric MPBall MPBall where
-  mul (MPBall x1 e1) (MPBall x2 e2) =
+  mul = mulBalls
+  -- mul = mulByEndpoints
+
+mulBalls :: MPBall -> MPBall -> MPBall
+mulBalls (MPBall x1 e1) (MPBall x2 e2) =
     normalize $ MPBall x12C (e12 + e1*(abs x2) + e2*(abs x1) + e1*e2)
       -- the mixed operations above automatically convert
       -- MPFloat to ErrorBound, checking non-negativity
     where
     (x12C, e12) = MPFloat.ceduCentreErr $ MPFloat.mulCEDU x1 x2
 
+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
+
+
 instance CanMulAsymmetric MPBall Int where
   type MulType MPBall Int = MPBall
   mul = convertSecond mul
@@ -254,11 +278,11 @@
 instance CanPow MPBall Int where
   pow = powUsingMulRecipCutNeg (mpBall 1)
 
-powUsingMulRecipCutNeg :: _ => t -> t -> e -> DivType Integer t
+powUsingMulRecipCutNeg :: _ => MPBall -> MPBall -> e -> MPBall
 powUsingMulRecipCutNeg one x e 
   | even e = 
-      max 0 $ powUsingMulRecip one x e
-  | otherwise = powUsingMulRecip one x e
+      max 0 $ powUsingMulRecip one mulByEndpoints recip x e
+  | otherwise = powUsingMulRecip one mulByEndpoints recip x e
 
 instance
   (CanPow MPBall b)
diff --git a/src/AERN2/MP/Dyadic.hs b/src/AERN2/MP/Dyadic.hs
--- a/src/AERN2/MP/Dyadic.hs
+++ b/src/AERN2/MP/Dyadic.hs
@@ -458,9 +458,9 @@
   mul = CE.lift1T mul
 
 instance CanPow Dyadic Integer where
-  pow = powUsingMul (dyadic 1)
+  pow = powUsingMul (dyadic 1) (*)
 instance CanPow Dyadic Int where
-  pow = powUsingMul (dyadic 1)
+  pow = powUsingMul (dyadic 1) (*)
 
 instance
   (CanDiv a Dyadic
