diff --git a/cbits/fe_round.c b/cbits/fe_round.c
deleted file mode 100644
--- a/cbits/fe_round.c
+++ /dev/null
@@ -1,5 +0,0 @@
-#include <fenv.h>
-int fe_tonearest  = FE_TONEAREST;
-int fe_upward     = FE_UPWARD;
-int fe_downward   = FE_DOWNWARD;
-int fe_towardzero = FE_TOWARDZERO;
diff --git a/cbits/ieee_utils.c b/cbits/ieee_utils.c
new file mode 100644
--- /dev/null
+++ b/cbits/ieee_utils.c
@@ -0,0 +1,15 @@
+#include <fenv.h>
+
+/* Rounding Mode */
+int fe_tonearest  = FE_TONEAREST;
+int fe_upward     = FE_UPWARD;
+int fe_downward   = FE_DOWNWARD;
+int fe_towardzero = FE_TOWARDZERO;
+
+/* Floating Point Exceptions */
+int fe_divbyzero  = FE_DIVBYZERO;
+int fe_inexact    = FE_INEXACT;
+int fe_invalid    = FE_INVALID;
+int fe_overflow   = FE_OVERFLOW;
+int fe_underflow  = FE_UNDERFLOW;
+int fe_all_except = FE_ALL_EXCEPT;
diff --git a/ieee-utils.cabal b/ieee-utils.cabal
--- a/ieee-utils.cabal
+++ b/ieee-utils.cabal
@@ -1,25 +1,25 @@
-name:               ieee-utils
-version:            0.2
-cabal-version:      >= 1.3
-build-type:         Simple
-license:            BSD3
-license-file:       LICENSE
-category:           Numerical
-author:             Matt Morrow
-copyright:          (c) Matt Morrow
-maintainer:         Matt Morrow <mjm2002@gmail.com>
-stability:          provisional
-synopsis:           ieee-utils
-description:        IEEE 754 (Standard for Binary Floating-Point Arithmetic) Utilities.
-                    Haddock docs are at <http://code.haskell.org/~morrow/code/haskell/ieee-utils/haddock/>.
-
-library
-  build-tools:
-  build-depends:      base
-  ghc-options:        -O2 -Wall
-  extensions:         ForeignFunctionInterface
-  hs-source-dirs:     src
-  includes:           fenv.h
-  c-sources:          cbits/fe_round.c
-  extra-libraries:
-  exposed-modules:    Numeric.IEEE.RoundMode
+name:               ieee-utils
+version:            0.3
+cabal-version:      >= 1.3
+build-type:         Simple
+license:            BSD3
+license-file:       LICENSE
+category:           Numerical
+author:             Matt Morrow, Sterling Clover
+copyright:          (c) Matt Morrow
+maintainer:         Matt Morrow <mjm2002@gmail.com>
+stability:          provisional
+synopsis:           ieee-utils
+description:        IEEE 754 (Standard for Binary Floating-Point Arithmetic) Utilities.
+
+library
+  build-tools:
+  build-depends:    base
+  ghc-options:      -O2 -Wall
+  extensions:       ForeignFunctionInterface
+  hs-source-dirs:   src
+  includes:         fenv.h
+  c-sources:        cbits/ieee_utils.c
+  extra-libraries:
+  exposed-modules:  Numeric.IEEE.RoundMode,
+                    Numeric.IEEE.FloatExceptions
diff --git a/src/Numeric/IEEE/FloatExceptions.hs b/src/Numeric/IEEE/FloatExceptions.hs
new file mode 100644
--- /dev/null
+++ b/src/Numeric/IEEE/FloatExceptions.hs
@@ -0,0 +1,65 @@
+{-# LANGUAGE ForeignFunctionInterface #-}
+
+{- |
+  Module      :  Numeric.IEEE.FloatExceptions
+  Copyright   :  (c) Sterling Clover 2008 <s.clover@gmail.com>
+  License     :  BSD3
+  Maintainer  :  Matt Morrow <mjm2002@gmail.com>
+  Stability   :  provisional
+  Portability :  portable (FFI)
+-}
+
+module Numeric.IEEE.FloatExceptions (
+    getFloatExcepts
+  , clearFloatExcepts
+  , ArithException (..)
+) where
+
+import Foreign.C(CInt)
+import Foreign.Ptr(Ptr)
+import Foreign.Storable(peek)
+import System.IO.Unsafe(unsafePerformIO)
+import Control.Exception(ArithException(..))
+import Data.Bits((.&.),(.|.))
+
+foreign import ccall unsafe "fenv.h fetestexcept" c_fetestexcept :: CInt -> IO CInt
+foreign import ccall unsafe "fenv.h feclearexcept" c_feclearexcept :: CInt -> IO CInt
+
+-- | Clears the specified exceptions from the fpu's exception register.
+clearFloatExcepts :: [ArithException] -> IO Bool
+clearFloatExcepts xs = (==0) `fmap` (c_feclearexcept . foldr (.|.) 0 . map (fromIntegral . fromEnum) $ xs)
+
+-- | Returns all exceptions set in the fpu's exception register.
+getFloatExcepts :: IO [ArithException]
+getFloatExcepts = do
+  exs <- fromIntegral `fmap` c_fetestexcept (fromIntegral feAllExcept)
+  return . map toEnum . filter (/=0) . map (.&. exs) $
+             [feDivByZero, feInexact, feInvalid, feOverflow, feUnderflow]
+
+instance Enum ArithException where
+  toEnum n
+    | n==feDivByZero  = DivideByZero
+    | n==feInexact    = LossOfPrecision
+    | n==feInvalid    = Denormal
+    | n==feOverflow   = Overflow
+    | n==feUnderflow  = Underflow
+  fromEnum DivideByZero    = feDivByZero
+  fromEnum LossOfPrecision = feInexact
+  fromEnum Denormal        = feInvalid
+  fromEnum Overflow        = feOverflow
+  fromEnum Underflow       = feUnderflow
+
+feDivByZero, feInexact, feInvalid, feOverflow, feUnderflow, feAllExcept :: Int
+feDivByZero   = fromIntegral . unsafePerformIO . peek $ fe_divbyzero
+feInexact     = fromIntegral . unsafePerformIO . peek $ fe_inexact
+feInvalid     = fromIntegral . unsafePerformIO . peek $ fe_invalid
+feOverflow    = fromIntegral . unsafePerformIO . peek $ fe_overflow
+feUnderflow   = fromIntegral . unsafePerformIO . peek $ fe_underflow
+feAllExcept   = fromIntegral . unsafePerformIO . peek $ fe_all_except
+
+foreign import ccall unsafe "&" fe_divbyzero  :: Ptr CInt
+foreign import ccall unsafe "&" fe_inexact    :: Ptr CInt
+foreign import ccall unsafe "&" fe_invalid    :: Ptr CInt
+foreign import ccall unsafe "&" fe_overflow   :: Ptr CInt
+foreign import ccall unsafe "&" fe_underflow  :: Ptr CInt
+foreign import ccall unsafe "&" fe_all_except :: Ptr CInt
