elynx-tools-0.0.1: src/ELynx/Tools/Numeric.hs
{- |
Module : ELynx.Tools.Numeric
Copyright : (c) Dominik Schrempf 2019
License : GPL-3
Maintainer : dominik.schrempf@gmail.com
Stability : unstable
Portability : portable
Creation date: Thu Feb 14 13:28:37 2019.
Numerical functions.
-}
module ELynx.Tools.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)