Safe Haskell | Safe-Inferred |
---|---|

Language | Haskell2010 |

## Synopsis

- d_randtest :: Ptr CFRandState -> IO CDouble
- d_randtest_signed :: Ptr CFRandState -> CLong -> CLong -> IO CDouble
- d_randtest_special :: Ptr CFRandState -> CLong -> CLong -> IO CDouble
- d_polyval :: Ptr CDouble -> CInt -> CDouble -> IO CDouble
- d_lambertw :: CDouble -> IO CDouble
- d_is_nan :: CDouble -> IO CInt
- d_log2 :: CDouble -> IO CDouble

# Support functions for double arithmetic

# Random functions

d_randtest :: Ptr CFRandState -> IO CDouble Source #

*d_randtest* *state*

Returns a random number in the interval \([0.5, 1)\).

d_randtest_signed :: Ptr CFRandState -> CLong -> CLong -> IO CDouble Source #

*d_randtest_signed* *state* *minexp* *maxexp*

Returns a random signed number with exponent between `minexp`

and
`maxexp`

or zero.

d_randtest_special :: Ptr CFRandState -> CLong -> CLong -> IO CDouble Source #

*d_randtest_special* *state* *minexp* *maxexp*

Returns a random signed number with exponent between `minexp`

and
`maxexp`

, zero, `D_NAN`

or \(\pm\)`D_INF`

.

# Arithmetic

d_polyval :: Ptr CDouble -> CInt -> CDouble -> IO CDouble Source #

*d_polyval* *poly* *len* *x*

Uses Horner's rule to evaluate the polynomial defined by the given
`len`

coefficients. Requires that `len`

is nonzero.

# Special functions

d_lambertw :: CDouble -> IO CDouble Source #

*d_lambertw* *x*

Computes the principal branch of the Lambert W function, solving the equation \(x = W(x) \exp(W(x))\). If \(x < -1/e\), the solution is complex, and NaN is returned.

Depending on the magnitude of \(x\), we start from a piecewise rational approximation or a zeroth-order truncation of the asymptotic expansion at infinity, and perform 0, 1 or 2 iterations with Halley's method to obtain full accuracy.

A test of \(10^7\) random inputs showed a maximum relative error smaller
than 0.95 times `DBL_EPSILON`

(2^{-52}) for positive \(x\). Accuracy for
negative \(x\) is slightly worse, and can grow to about 10 times
`DBL_EPSILON`

close to \(-1/e\). However, accuracy may be worse
depending on compiler flags and the accuracy of the system libm
functions.