
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.