Simon PJ wrote:
Fpr the Revised Haskell 98 report, Russell O'Connor suggests: =20 | Also, I understand you are reluctant to make library changes,=20 | but sinh and cosh can easily be defined in terms of exp |=20 | sinh x =3D (exp(x) - exp(-x))/2 | cosh x =3D (exp(x) + exp(-x))/2 |=20 | (source: Calculus Third Edition by Michael Spivak, page 349,=20 | or any decent calculus book) |=20 | I suggest removing sinh and cosh from the minimal complete=20 | definition, and add the above defaults.
This looks pretty reasonable to me. We should have default methods for anything we can.
Comments? No. As has been pointed out, this is a bad idea numerically because it will give the wrong answer for sinh x for very small values of x. As a matter of fact, you will also get the wrong answer for very large values of x, where exp(x) can overflow even though sinh x and cosh x don't, meaning you get an incorrect answer of positive infinity.
I suggest saying as little about the transcendental functions as possible, rather than forcing incorrect rules on the implementor. I imagine most Haskell implementors do not want to waste time writing their own transcendental function routines, but simply call out to one of the various high-quality C implementations. (Netlib has a good free one, for example.) This will probably produce better results than suggesting buggy code to the implementor. Technically, you would probably be able to define all the functions sinh/cosh/tanh/exp functions with reasonable precision in terms of expm1, defined mathematically as expm1(x) = exp(x) - 1. But please don't . . .