[Haskell-cafe] floating point operations and representation
quark at bluespec.com
Wed Mar 12 20:35:46 EDT 2008
I have two questions about using the Double data type and the
operations in the Floating typeclass on a computer that uses IEEE
floating point numbers.
I notice that the Floating class only provides "log" (presumably log
base 'e') and "logBase" (which, in the latest source that I see for
GHC is defined as "log y / log x"). However, in C, the "math.h"
library provides specific "log2" and "log10" functions, for extra
precision. A test on IEEE computers (x86 and x86-64), shows that for
a range of 64-bit "double" values, the answers in C do differ (in the
last bit) if you use "log2(x)" and "log10(x)" versus "log (x) /
log(2)" and "log(x) / log(10)".
I am under the restriction that I need to write Haskell programs using
Double which mimic existing C/C++ programs or generated data sets, and
get the same answers. (It's silly, but take it as a given
requirement.) If the C programs are using "log2", then I need "log2"
in the Haskell, or else I run the risk of not producing the same
answers. My first thought is to import "log2" and "log10" through the
FFI. I was wondering if anyone on Haskell-Cafe has already done this
and/or has a better suggestion about how to get specialized "log2" and
"log10" (among the many specialized functions that the "math.h"
library provides, for better precision -- for now, I'm just concerned
with "log2" and "log10").
My second question is how to get at the IEEE bit representation for a
Double. I am already checking "isIEEE n" in my source code (and
"floatRadix n == 2"). So I know that I am operating on hardware that
implements floating point numbers by the IEEE standard. I would like
to get at the 64 bits of a Double. Again, I can convert to a CDouble
and use the FFI to wrap a C function which casts the "double" to a
64-bit number and returns it. But I'm wondering if there's not a
better way to do this natively in Haskell/GHC (perhaps some crazy use
of the Storable typeclass?). Or if someone has already tackled this
problem with FFI, that would be interesting to know.
More information about the Haskell-Cafe