[Haskell-cafe] C's fmod in Haskell
Henning Thielemann
lemming at henning-thielemann.de
Mon Sep 24 07:49:41 EDT 2007
On Sun, 23 Sep 2007, Thomas Conway wrote:
> In Prelude there is a function properFraction which splits a RealFrac
> into its integer part and its fractional part. You can use this to
> implement fmod. Assuming properFraction is efficient (which it
> probably isn't), you can implement fmod really quite efficiently.
>
> In particular, x `fmod` 1.0 == (snd . properFraction) x
Unfortunately, properFraction doesn't work well with negative numbers.
I get
Prelude> properFraction (-0.3)
(0,-0.3)
but usually I need
Prelude> properFraction (-0.3)
(-1,0.7)
Thus I defined a work-around:
> splitFraction x =
> let (n,f) = properFraction x
> in if x>=0 || f==0
> then (fromInteger n, f)
> else (fromInteger n-1, f+1)
See also
http://www.haskell.org/haskellwiki/Things_to_avoid#Forget_about_quot_and_rem
More information about the Haskell-Cafe
mailing list