Wow, you have a tough mission if you want to replicate the bit level answers for double (btw, hi Jacob).<br>Libraries differ for transcendental function, and even worse, CPUs differ.&nbsp; You may get different answers on an Intel and and AMD.<br>
That said, I think your best bet is to import log2 and log10 from C and use those.<br><br>Haskell sadly lacks an efficient way to go from a Double to its bit pattern. :(<br><br>&nbsp; -- Lennart<br><br><div class="gmail_quote">
On Thu, Mar 13, 2008 at 12:35 AM, Jacob Schwartz &lt;<a href="mailto:quark@bluespec.com">quark@bluespec.com</a>&gt; wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
I have two questions about using the Double data type and the<br>
operations in the Floating typeclass on a computer that uses IEEE<br>
floating point numbers.<br>
<br>
I notice that the Floating class only provides &quot;log&quot; (presumably log<br>
base &#39;e&#39;) and &quot;logBase&quot; (which, in the latest source that I see for<br>
GHC is defined as &quot;log y / log x&quot;). &nbsp;However, in C, the &quot;math.h&quot;<br>
library provides specific &quot;log2&quot; and &quot;log10&quot; functions, for extra<br>
precision. &nbsp;A test on IEEE computers (x86 and x86-64), shows that for<br>
a range of 64-bit &quot;double&quot; values, the answers in C do differ (in the<br>
last bit) if you use &quot;log2(x)&quot; and &quot;log10(x)&quot; versus &quot;log (x) /<br>
log(2)&quot; and &quot;log(x) / log(10)&quot;.<br>
<br>
I am under the restriction that I need to write Haskell programs using<br>
Double which mimic existing C/C++ programs or generated data sets, and<br>
get the same answers. &nbsp;(It&#39;s silly, but take it as a given<br>
requirement.) &nbsp;If the C programs are using &quot;log2&quot;, then I need &quot;log2&quot;<br>
in the Haskell, or else I run the risk of not producing the same<br>
answers. &nbsp;My first thought is to import &quot;log2&quot; and &quot;log10&quot; through the<br>
FFI. &nbsp;I was wondering if anyone on Haskell-Cafe has already done this<br>
and/or has a better suggestion about how to get specialized &quot;log2&quot; and<br>
&quot;log10&quot; (among the many specialized functions that the &quot;math.h&quot;<br>
library provides, for better precision -- for now, I&#39;m just concerned<br>
with &quot;log2&quot; and &quot;log10&quot;).<br>
<br>
My second question is how to get at the IEEE bit representation for a<br>
Double. &nbsp;I am already checking &quot;isIEEE n&quot; in my source code (and<br>
&quot;floatRadix n == 2&quot;). &nbsp;So I know that I am operating on hardware that<br>
implements floating point numbers by the IEEE standard. &nbsp;I would like<br>
to get at the 64 bits of a Double. &nbsp;Again, I can convert to a CDouble<br>
and use the FFI to wrap a C function which casts the &quot;double&quot; to a<br>
64-bit number and returns it. &nbsp;But I&#39;m wondering if there&#39;s not a<br>
better way to do this natively in Haskell/GHC (perhaps some crazy use<br>
of the Storable typeclass?). &nbsp;Or if someone has already tackled this<br>
problem with FFI, that would be interesting to know.<br>
<br>
Thanks.<br>
<br>
Jacob<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
</blockquote></div><br>