<div dir="auto">Hey Barak,</div><div dir="auto"><br></div><div dir="auto">These are really good points. They seem worth submitting to the GHC issue tracker. This would be a first step on the way to improve the current (not ideal, as you say) state.</div><div dir="auto"><br></div><div dir="auto">—</div><div dir="auto">Best, Artem</div><div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Sep 17, 2021 at 5:06 PM Barak A. Pearlmutter <<a href="mailto:barak@pearlmutter.net">barak@pearlmutter.net</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;padding-left:1ex;border-left-color:rgb(204,204,204)">I suspect that most implementations of Common Lisp just call the C<br>
standard library catan(3) etc, which are well tuned.<br>
<br>
$ clisp<br>
Welcome to GNU CLISP 2.49.92 (2018-02-18) <<a href="http://clisp.org/" rel="noreferrer" target="_blank">http://clisp.org/</a>><br>
[1]> (atan #c(0 1d-40))<br>
#C(0 1.0d-40)<br>
<br>
In this particular case, the problem is that the Haskell Data.Complex<br>
code has its own implementation of atan, which uses a log(1 + x) in<br>
calculating the imaginary part. A foreign function call to the<br>
appropriate libm routine would robustly address this, but that would<br>
be difficult because it's trying to be generic over RealFloat a =><br>
Complex a, instead of special casing Complex Float / Complex Double.<br>
Anyway, the Standard Prelude code for this is naïve: it should call<br>
log1p, at the very least—which it actually goes to the trouble of<br>
defining correctly, but not exporting.<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
To (un)subscribe, modify options or view archives go to:<br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
Only members subscribed via the mailman list are allowed to post.</blockquote></div></div>