[Haskell-cafe] ANN: logfloat

wren ng thornton wren at freegeek.org
Fri Aug 15 20:50:40 EDT 2008


--------------------------------------------
-- Announcing: logfloat 0.8.2
--------------------------------------------

I just released a new package, logfloat, for manipulating log-domain 
floating numbers.

The main reason for casting numbers into the log-domain is to prevent 
underflow when multiplying many small probabilities as is done in Hidden 
Markov Models and other statistical models often used for natural 
language processing. The log-domain also helps prevent overflow when 
multiplying many large numbers. In rare cases it can speed up numerical 
computation (since addition is faster than multiplication, though 
logarithms are exceptionally slow), but the primary goal is to improve 
accuracy of results. A secondary goal has been to maximize efficiency 
since these computations are frequently done within a /O(n^3)/ loop.

The Data.Numeric.LogFloat module provides a new data type LogFloat which 
handles all the conversions and optimizations and can be treated as any 
other number thanks to type classes.


--------------------------------------------
-- Links
--------------------------------------------

Homepage:
     http://code.haskell.org/~wren/

Hackage:
     http://hackage.haskell.org/cgi-bin/hackage-scripts/package/logfloat

Darcs:
     http://code.haskell.org/~wren/logfloat


--------------------------------------------
-- Details
--------------------------------------------

The package's version numbers start from 0.8 since this began as a port 
of my Perl module for doing the same thing.

The code is very heavily documented, largely for pedagogical reasons. 
Since Haddock doesn't play very nicely with literate Haskell, there's 
also a small lhs2hs converter script which gets run when you call: 
runhaskell Setup.hs haddock. This converter requires the bytestring 
package. The library proper does not, so I didn't include this 
dependency for the package itself.

The package uses GHC's rewrite rules to do log/exp fusion. In general, 
since a newtype is used, the module shouldn't add overhead (beyond 
crossing the log/exp boundary). In the future I'll be experimenting with 
strictness as well to try to ensure that everything stays in registers 
for those /O(n^3)/ loops. I'm not sure whether it'd be helpful to keep a 
lazy version around as well...

The LogFloat type is restricted to non-negative numbers. In the future 
I'll also add a signed variant for those who aren't just doing 
statistical work.

-- 
Live well,
~wren


More information about the Haskell-Cafe mailing list