diff --git a/Matrix/QR/Givens.hs b/Matrix/QR/Givens.hs
--- a/Matrix/QR/Givens.hs
+++ b/Matrix/QR/Givens.hs
@@ -1,6 +1,6 @@
 module Matrix.QR.Givens  (
    leastSquares,
-   decompose, solve, det,
+   decompose, solve, det, detAbs,
    Rotation, rotateVector,
    Upper, solveUpper, detUpper,
    ) where
@@ -156,5 +156,16 @@
      then product $ map (snd . Map.findMin) $ Map.elems rows
      else 0
 
+{- |
+Only sensible for square matrices,
+but the function does not check whether the matrix is square.
+-}
 det :: (Ix i, Enum i, Ix j, Enum j, RealFloat a) => Sparse.Matrix i j a -> a
 det = detUpper . snd . decompose
+
+{- |
+Absolute value of the determinant.
+This is also sound for non-square matrices.
+-}
+detAbs :: (Ix i, Enum i, Ix j, Enum j, RealFloat a) => Sparse.Matrix i j a -> a
+detAbs = abs . det
diff --git a/Matrix/QR/Householder.hs b/Matrix/QR/Householder.hs
--- a/Matrix/QR/Householder.hs
+++ b/Matrix/QR/Householder.hs
@@ -1,6 +1,6 @@
 module Matrix.QR.Householder (
    leastSquares,
-   decompose, solve, det,
+   decompose, solve, det, detAbs,
    Reflection, reflectMatrix, reflectVector,
    Upper, matrixFromUpper, solveUpper, detUpper,
    ) where
@@ -146,7 +146,23 @@
      then product $ map (head . elems) rs
      else 0
 
+{- |
+Only sensible for square matrices,
+but the function does not check whether the matrix is square.
+
+For non-square matrices the sign is not of much use.
+It depends on the implementation.
+It is not uniquely defined by requiring
+that the determinant of the orthogonal transformation has positive sign.
+-}
 det :: (Ix i, Enum i, Ix j, Enum j, RealFloat a) => Array (i,j) a -> a
 det a =
    let (qs,u) = decompose a
    in  (if even (length qs) then 1 else -1) * detUpper u
+
+{- |
+Absolute value of the determinant.
+This is also sound for non-square matrices.
+-}
+detAbs :: (Ix i, Enum i, Ix j, Enum j, RealFloat a) => Array (i,j) a -> a
+detAbs = abs . detUpper . snd . decompose
diff --git a/dsp.cabal b/dsp.cabal
--- a/dsp.cabal
+++ b/dsp.cabal
@@ -1,5 +1,5 @@
 Name:             dsp
-Version:          0.2.4.1
+Version:          0.2.5
 License:          GPL
 License-File:     COPYING
 Copyright:        Matt Donadio, 2003
@@ -17,7 +17,7 @@
 Build-Type:       Simple
 
 Source-Repository this
-  Tag:         0.2.4.1
+  Tag:         0.2.5
   Type:        darcs
   Location:    http://code.haskell.org/~thielema/dsp/
 
diff --git a/test/Test/Matrix/QR.hs b/test/Test/Matrix/QR.hs
--- a/test/Test/Matrix/QR.hs
+++ b/test/Test/Matrix/QR.hs
@@ -88,8 +88,11 @@
 approx :: (Fractional a, Ord a) => a -> a -> Bool
 approx x y  =  abs (x-y) <= 1e-5 * max 1 (abs x + abs y)
 
+maxNorm :: (Num a, Ord a, Ix i) => Array i a -> a
+maxNorm = Fold.foldl max 0 . fmap abs
+
 approxAbsVector :: (Fractional a, Ord a, Ix i) => Array i a -> Array i a -> Bool
-approxAbsVector x y = (Fold.foldl max 0 $ fmap abs $ Vector.sub x y) < 1e-5
+approxAbsVector x y = maxNorm (Vector.sub x y) <= 1e-5
 
 
 
@@ -129,12 +132,12 @@
 gramianHouseholder :: QC.Property
 gramianHouseholder =
    QC.forAll (fmap doubleArray genMatrix) $ \a ->
-      gramian a `approx` (Householder.det a ^! 2)
+      gramian a `approx` (Householder.detAbs a ^! 2)
 
 gramianGivens :: QC.Property
 gramianGivens =
    QC.forAll (fmap fromIntegral <$> genSparse) $ \a ->
-      gramian (Sparse.toDense a)  `approx`  (Givens.det a ^! 2)
+      gramian (Sparse.toDense a)  `approx`  (Givens.detAbs a ^! 2)
 
 detHouseholder :: QC.Property
 detHouseholder =
