AC-Colour-1.1.1: Data/Colour/FastFloor.hs
{-# LANGUAGE MagicHash #-}
{- |
This module shouldn't need to exist. It exists because
GHC's implementation of 'floor' is currently (6.10.3)
very slow. See the following tickets:
<http://hackage.haskell.org/trac/ghc/ticket/1434>
<http://hackage.haskell.org/trac/ghc/ticket/2271>
-}
module Data.Colour.FastFloor where
import GHC.Prim
import GHC.Types
import GHC.Word
{- |
This is a special version of the regular 'floor' function.
It works by directly calling the low-level internal GHC
primitives, and thus is as fast as you'd expect for such
a trivial operation.
(The standard 'floor' function does something crazy like
converting a @Double@ to a numerator/denominator @Integer@
pair and then computing the integer part of the quotient as
an @Integer@, then truncating that to a @Word8@. Which,
obviously, is ludicrously slow.)
Hopefully one day the need for this low-level hackery
will disappear.
-}
fast_floor :: Double -> Word8
fast_floor (D# d#) = W8# (int2Word# (double2Int# d#))