diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,6 +1,11 @@
 # mixed-types-num change log
 
-* v 0.4.1 2019-04-11
+* v 0.4.1 2021-01-21
+  * add hasErrorCE and hasErrorCN for testing if CE/CN values contain errors
+* v 0.4.0.2 2020-08-02
+  * remove smallcheck version upper bound
+  * update to cabal-version >= 1.10
+* v 0.4.0.1 2019-04-11
   * fix infinite loop in some conversions
 * v 0.4.0 2019-04-10
   * eliminated dependency on convertible, improving ghcjs compatibility
diff --git a/mixed-types-num.cabal b/mixed-types-num.cabal
--- a/mixed-types-num.cabal
+++ b/mixed-types-num.cabal
@@ -1,11 +1,11 @@
 name:           mixed-types-num
-version:        0.4.0.2
+version:        0.4.1
 cabal-version:  >= 1.10
 build-type:     Simple
 homepage:       https://github.com/michalkonecny/mixed-types-num
 author:         Michal Konecny
 maintainer:     Michal Konecny <mikkonecny@gmail.com>
-copyright:      (c) 2015-2019 Michal Konecny
+copyright:      (c) 2015-2021 Michal Konecny
 license:        BSD3
 license-file:   LICENSE
 extra-source-files:  changelog.md
diff --git a/src/Control/CollectErrors.hs b/src/Control/CollectErrors.hs
--- a/src/Control/CollectErrors.hs
+++ b/src/Control/CollectErrors.hs
@@ -4,6 +4,7 @@
 -- * Monad for collecting errors in expressions
   CollectErrors(..), SuitableForCE
 , CanTestErrorsCertain(..), hasCertainErrorCE
+, CanTestErrorsPresent(..), hasErrorCE
 , noValueCE, prependErrorsCE
 , filterValuesWithoutErrorCE, getValueIfNoErrorCE
 , ce2ConvertResult
@@ -60,6 +61,12 @@
 
 hasCertainErrorCE :: (CanTestErrorsCertain es) => (CollectErrors es v) -> Bool
 hasCertainErrorCE (CollectErrors _ es) = hasCertainError es
+
+class CanTestErrorsPresent es where
+  hasError :: es -> Bool
+
+hasErrorCE :: (CanTestErrorsPresent es) => (CollectErrors es v) -> Bool
+hasErrorCE (CollectErrors _ es) = hasError es
 
 type SuitableForCE es = (Monoid es, Eq es, Show es, CanTestErrorsCertain es)
 
diff --git a/src/MixedTypesNumPrelude.hs b/src/MixedTypesNumPrelude.hs
--- a/src/MixedTypesNumPrelude.hs
+++ b/src/MixedTypesNumPrelude.hs
@@ -125,6 +125,25 @@
 Note that when evaluating @1/0@, it evaluates to the error value printed above.
 This is not an exception, but a special value.
 
+All arithmetic operations have been extended to CN types so that it is possible to
+have expressions that operate exclusively on CN types:
+
+>...> f (n :: CN Integer) = 1/(1/(n-1) + 1/n) :: CN Rational
+>...> f (cn 0)
+>{[(ERROR,division by 0)]}
+>...> f (cn 1)
+>{[(ERROR,division by 0)]}
+>...> f (cn 2)
+>2 % 3
+
+The function hasErrorCN can be used to check whether any error occurred:
+
+>...> hasErrorCN (1/0)
+>True
+
+>...> hasErrorCN (1/1)
+>False
+
 When one is certain the division is well defined, one can remove @CN@ as follows:
 
 >...> :t (1/!2)
@@ -163,11 +182,19 @@
 
 Also other harmless potential errors can be ignored using @(~!)@:
 
->...> (~!) $ sqrt (pi-pi)
->[7.395570986446986e-32 ± <2^(-103)]
+>...> (~!) $ sqrt (pi-pi) ? (bitsS 10)
+> [0.000007629... ± 7.6294e-6 <2^(-17)]
 
->...> sqrt (pi-pi)
->[7.395570986446986e-32 ± <2^(-103)]{[(POTENTIAL ERROR,out of range: sqrt: argument must be >= 0: [0 ± <2^(-240)])]}
+>...> sqrt (pi-pi) ? (bitsS 10)
+> [0.000007629... ± 7.6294e-6 <2^(-17)]{[(POTENTIAL ERROR,out of range: sqrt: argument must be >= 0: [0 ± 2.3283e-10 <2^(-32)])]}
+
+When an error is present (which can be checked using hasErrorCN), the function hasCertainErrorCN can be used to further distinguish cases where the error is certain or potential:
+
+>...> hasCertainErrorCN (sqrt (-1) ? (bitsS 10))
+>True
+
+>...> hasCertainErrorCN (sqrt (pi-pi) ? (bitsS 10))
+>False
 
 
 === Natural, integer and fractional powers
diff --git a/src/Numeric/CollectErrors.hs b/src/Numeric/CollectErrors.hs
--- a/src/Numeric/CollectErrors.hs
+++ b/src/Numeric/CollectErrors.hs
@@ -17,6 +17,7 @@
   -- * Specialisation to numeric errors
 , CN
 , hasCertainError, hasCertainErrorCN
+, hasError, hasErrorCN
 , noValueCN
 , noValueNumErrorCertainCN, noValueNumErrorPotentialCN
 , getMaybeValueCN, getErrorsCN, prependErrorsCN
@@ -31,7 +32,7 @@
 where
 
 import Prelude
-  (Show(..), Eq(..), Bool, String, Maybe(..), Either(..), (++), (.), or, map, fst, ($))
+  (Show(..), Eq(..), Bool, String, Maybe(..), Either(..), (++), (.), or, map, fst, ($), null, not)
 
 import Control.CollectErrors
 
@@ -60,6 +61,12 @@
 
 hasCertainErrorCN :: CN v -> Bool
 hasCertainErrorCN = hasCertainErrorCE
+
+instance CanTestErrorsPresent NumErrors where
+  hasError = not . null
+
+hasErrorCN :: CN v -> Bool
+hasErrorCN = hasErrorCE
 
 sample_NumErrors :: Maybe [(ErrorCertaintyLevel, NumError)]
 sample_NumErrors = Nothing
