truncate/floor with logBase

Hans Aberg haberg@matematik.su.se
Mon, 30 Sep 2002 11:00:15 +0200


At 08:08 +0200 2002/09/30, Thorsten Stocksmeier wrote:
>Main> floor (logBase 2 (fromInteger 32768)) -- should be == floor 15.0
>> > 14
>>
>>Rounding error I suspect.
>>
>>Prelude> logBase 2 (fromInteger 32768) - 15.0
>>-9.53674e-07
>
>Okay, but is that my fault or hugs'?

Any code that treats floating point numbers as though they are exact
numbers is faulty.

>Independent of that: Is there a workaround? Before logBase
>I used log n / log 2 as a simulation of logBase 2. Still have
>to find out whether this solves the problem. (well maybe
>logBase *is* in fact log/log - must stick my nose into the
>prelude this afternoon)

If you need to compare floating point numbers x, y, introduce a small
epsilon > 0, and write abs(x - y) < epsilon instead of x == y. If you need
them to be exact integers, make a roundoff. Etc.

  Hans Aberg