{- | Module : ELynx.Tools.Numeric Copyright : (c) Dominik Schrempf 2020 License : GPL-3.0-or-later Maintainer : dominik.schrempf@gmail.com Stability : unstable Portability : portable Creation date: Thu Feb 14 13:28:37 2019. Numerical functions. -} module ELynx.Tools.Numeric ( -- * Numeric harmonic , xLogX , roundN ) where import ELynx.Tools.Equality -- | Calculate the nth harmonic number. harmonic :: Int -> Double harmonic 1 = 1.0 harmonic n = 1.0 / fromIntegral n + harmonic (n - 1) -- | Calculate x*log(x) but set to 0.0 when x is smaller than 'eps'. xLogX :: Double -> Double xLogX x | x < 0.0 = error "Argument lower than zero." | x `nearlyEq` 0.0 = 0.0 | otherwise = x * log x -- | Round double to a given precision. roundN :: Int -> Double -> Double roundN n v = fromInteger (round $ v * (10 ^ n)) / (10.0 ^^ n)