diff --git a/ChangeLog b/ChangeLog
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,4 @@
+0.4.2: 2nd Sep 2016: Added RealFloat instances
 0.4.1: 2nd Aug 2016: Added support for digamma
 0.4.: 11th Jul 2016: Compiles only with ghc 7.10 or newer
 0.3.3: 22 Dec 2011: Compiles with both integer-simple and integer-gmp (but mis-behaves with standard integer-gmp).
diff --git a/hmpfr.cabal b/hmpfr.cabal
--- a/hmpfr.cabal
+++ b/hmpfr.cabal
@@ -1,5 +1,5 @@
 name:                hmpfr
-version:             0.4.1
+version:             0.4.2
 synopsis:            Haskell binding to the MPFR library
 description:
   Haskell binding to the MPFR library.
diff --git a/src/Data/Number/MPFR/Instances/Down.hs b/src/Data/Number/MPFR/Instances/Down.hs
--- a/src/Data/Number/MPFR/Instances/Down.hs
+++ b/src/Data/Number/MPFR/Instances/Down.hs
@@ -98,3 +98,20 @@
               e = denominator r
               n = quot m e
               f = frac Down (getPrec d) d
+
+instance RealFloat MPFR where
+    floatRadix _ = 2
+    floatDigits = fromInteger . toInteger . getPrec
+    floatRange _ = error "floatRange is not defined for MPFR numbers"
+    decodeFloat x = (d,e)
+      where
+      (d,eE) = decompose x
+      e = fromInteger (toInteger eE)
+    encodeFloat d e =
+      (fromInteger d) / ((fromInteger 2)^e) -- TODO: construct it directly
+    isNaN (MP _ _ e _) = (e == expNaN)
+    isInfinite (MP _ _ e _) = (e == expInf)
+    isDenormalized _ = False
+    isNegativeZero d@(MP _ _ e _) = (e == expZero && signbit d)
+    isIEEE _ = False
+    atan2 d1 d2 = S.atan2 Near (maxPrec d1 d2) d1 d2
diff --git a/src/Data/Number/MPFR/Instances/Near.hs b/src/Data/Number/MPFR/Instances/Near.hs
--- a/src/Data/Number/MPFR/Instances/Near.hs
+++ b/src/Data/Number/MPFR/Instances/Near.hs
@@ -96,3 +96,20 @@
               e = denominator r
               n = quot m e
               f = frac Near (getPrec d) d
+
+instance RealFloat MPFR where
+    floatRadix _ = 2
+    floatDigits = fromInteger . toInteger . getPrec
+    floatRange _ = error "floatRange is not defined for MPFR numbers"
+    decodeFloat x = (d,e)
+      where
+      (d,eE) = decompose x
+      e = fromInteger (toInteger eE)
+    encodeFloat d e =
+      (fromInteger d) / ((fromInteger 2)^e) -- TODO: construct it directly
+    isNaN (MP _ _ e _) = (e == expNaN)
+    isInfinite (MP _ _ e _) = (e == expInf)
+    isDenormalized _ = False
+    isNegativeZero d@(MP _ _ e _) = (e == expZero && signbit d)
+    isIEEE _ = False
+    atan2 d1 d2 = S.atan2 Near (maxPrec d1 d2) d1 d2
diff --git a/src/Data/Number/MPFR/Instances/Up.hs b/src/Data/Number/MPFR/Instances/Up.hs
--- a/src/Data/Number/MPFR/Instances/Up.hs
+++ b/src/Data/Number/MPFR/Instances/Up.hs
@@ -98,3 +98,20 @@
               e = denominator r
               n = quot m e
               f = frac Up (getPrec d) d
+
+instance RealFloat MPFR where
+    floatRadix _ = 2
+    floatDigits = fromInteger . toInteger . getPrec
+    floatRange _ = error "floatRange is not defined for MPFR numbers"
+    decodeFloat x = (d,e)
+      where
+      (d,eE) = decompose x
+      e = fromInteger (toInteger eE)
+    encodeFloat d e =
+      (fromInteger d) / ((fromInteger 2)^e) -- TODO: construct it directly
+    isNaN (MP _ _ e _) = (e == expNaN)
+    isInfinite (MP _ _ e _) = (e == expInf)
+    isDenormalized _ = False
+    isNegativeZero d@(MP _ _ e _) = (e == expZero && signbit d)
+    isIEEE _ = False
+    atan2 d1 d2 = S.atan2 Near (maxPrec d1 d2) d1 d2
diff --git a/src/Data/Number/MPFR/Instances/Zero.hs b/src/Data/Number/MPFR/Instances/Zero.hs
--- a/src/Data/Number/MPFR/Instances/Zero.hs
+++ b/src/Data/Number/MPFR/Instances/Zero.hs
@@ -97,3 +97,20 @@
               e = denominator r
               n = quot m e
               f = frac Zero (getPrec d) d
+
+instance RealFloat MPFR where
+    floatRadix _ = 2
+    floatDigits = fromInteger . toInteger . getPrec
+    floatRange _ = error "floatRange is not defined for MPFR numbers"
+    decodeFloat x = (d,e)
+      where
+      (d,eE) = decompose x
+      e = fromInteger (toInteger eE)
+    encodeFloat d e =
+      (fromInteger d) / ((fromInteger 2)^e) -- TODO: construct it directly
+    isNaN (MP _ _ e _) = (e == expNaN)
+    isInfinite (MP _ _ e _) = (e == expInf)
+    isDenormalized _ = False
+    isNegativeZero d@(MP _ _ e _) = (e == expZero && signbit d)
+    isIEEE _ = False
+    atan2 d1 d2 = S.atan2 Near (maxPrec d1 d2) d1 d2
