Desired behaviour of rounding etc.

Daniel Fischer daniel.is.fischer at web.de
Fri Oct 8 09:29:01 EDT 2010


On Friday 08 October 2010 14:08:01, Daniel Fischer wrote:
> On a related note, in my benchmarks,
>
> truncFloatGen :: Integral a => Float -> a
> truncFloatGen = fromInteger . truncFloatInteger
>
> truncFloatInteger :: Float -> Integer
> truncFloatInteger x =
>   case decodeFloat x of
>     (m,e) | e == 0  -> m
>           | e < 0   ->
>             let s = -e
>             in if m < 0
>                   then - ((-m) `shiftR` s)
>                   else m `shiftR` s
>           | otherwise -> m `shiftL` e
>
> is more than twice as fast as GHC.Float.float2Int, the corresponding for
> Double almost twice as fast as double2Int.
>
> Can anybody confirm that the above is faster than float2Int on other
> machines/architectures?

That one is more or less solved. For values inside the Int range, 
float2Int/double2Int are, as expected, much faster.
Only for values outside the Int range the picture changes, and I 
benchmarked over a much larger range.
Still odd that float2Int/double2Int degrade so badly outside the range.


More information about the Libraries mailing list