numeric-extras-0.0.3/0000755000000000000000000000000012160707124012646 5ustar0000000000000000numeric-extras-0.0.3/.travis.yml0000644000000000000000000000002212160707124014751 0ustar0000000000000000language: haskell numeric-extras-0.0.3/CHANGELOG.markdown0000644000000000000000000000006512160707124015702 0ustar00000000000000000.0.3 ----- * Marked `Numeric.Extras` `Trustworthy`. numeric-extras-0.0.3/LICENSE0000644000000000000000000000276212160707124013662 0ustar0000000000000000Copyright (c) 2010, Edward Kmett All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Edward Kmett nor the names of other contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. numeric-extras-0.0.3/numeric-extras.cabal0000644000000000000000000000141512160707124016601 0ustar0000000000000000name: numeric-extras version: 0.0.3 synopsis: Useful tools from the C standard library homepage: http://github.com/ekmett/numeric-extras bug-reports: http://github.com/ekmett/numeric-extras/issues license: BSD3 license-file: LICENSE author: Edward Kmett maintainer: ekmett@gmail.com category: Math build-type: Simple cabal-version: >=1.6 extra-source-files: .travis.yml CHANGELOG.markdown source-repository head type: git location: git://github.com/ekmett/numeric-extras.git library other-extensions: ForeignFunctionInterface FlexibleContexts TypeFamilies exposed-modules: Numeric.Extras build-depends: base >= 4 && < 5 ghc-options: -Wall -O2 numeric-extras-0.0.3/Setup.lhs0000644000000000000000000000014512160707124014456 0ustar0000000000000000#!/usr/bin/env runhaskell > import Distribution.Simple > main = defaultMainWithHooks simpleUserHooks numeric-extras-0.0.3/Numeric/0000755000000000000000000000000012160707124014250 5ustar0000000000000000numeric-extras-0.0.3/Numeric/Extras.hs0000644000000000000000000000463712160707124016064 0ustar0000000000000000{-# LANGUAGE ForeignFunctionInterface, FlexibleContexts, TypeFamilies #-} {-# LANGUAGE CPP #-} #if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ >= 702 {-# LANGUAGE Trustworthy #-} #endif module Numeric.Extras ( RealExtras(..) ) where import Foreign import Foreign.C.Types class (Storable (C a), RealFloat (C a), RealFloat a) => RealExtras a where type C a :: * fmod :: a -> a -> a expm1 :: a -> a log1p :: a -> a hypot :: a -> a -> a cbrt :: a -> a erf :: a -> a instance RealExtras Double where type C Double = CDouble fmod = lift2D c_fmod expm1 = lift1D c_expm1 log1p = lift1D c_log1p hypot = lift2D c_hypot cbrt = lift1D c_cbrt erf = lift1D c_erf lift1D :: (CDouble -> CDouble) -> Double -> Double lift1D f a = realToFrac (f (realToFrac a)) {-# INLINE lift1D #-} lift2D :: (CDouble -> CDouble -> CDouble) -> Double -> Double -> Double lift2D f a b = realToFrac (f (realToFrac a) (realToFrac b)) {-# INLINE lift2D #-} instance RealExtras Float where type C Float = CFloat fmod = lift2F c_fmodf expm1 = lift1F c_expm1f log1p = lift1F c_log1pf hypot = lift2F c_hypotf cbrt = lift1F c_cbrtf erf = lift1F c_erff lift1F :: (CFloat -> CFloat) -> Float -> Float lift1F f a = realToFrac (f (realToFrac a)) {-# INLINE lift1F #-} lift2F :: (CFloat -> CFloat -> CFloat) -> Float -> Float -> Float lift2F f a b = realToFrac (f (realToFrac a) (realToFrac b)) {-# INLINE lift2F #-} foreign import ccall unsafe "math.h fmod" c_fmod :: CDouble -> CDouble -> CDouble foreign import ccall unsafe "math.h expm1" c_expm1 :: CDouble -> CDouble foreign import ccall unsafe "math.h log1p" c_log1p :: CDouble -> CDouble foreign import ccall unsafe "math.h hypot" c_hypot :: CDouble -> CDouble -> CDouble foreign import ccall unsafe "math.h cbrt" c_cbrt :: CDouble -> CDouble foreign import ccall unsafe "math.h erf" c_erf :: CDouble -> CDouble foreign import ccall unsafe "math.h fmodf" c_fmodf :: CFloat -> CFloat -> CFloat foreign import ccall unsafe "math.h expm1f" c_expm1f :: CFloat -> CFloat foreign import ccall unsafe "math.h log1pf" c_log1pf :: CFloat -> CFloat foreign import ccall unsafe "math.h hypotf" c_hypotf :: CFloat -> CFloat -> CFloat foreign import ccall unsafe "math.h cbrtf" c_cbrtf :: CFloat -> CFloat foreign import ccall unsafe "math.h erff" c_erff :: CFloat -> CFloat default (Double)