44
44
45
45
# ## Real x
46
46
47
- function _lambertw (x:: Real , k:: Integer , maxits:: Integer )
48
- k == 0 && return lambertw_branch_zero (x, maxits)
49
- k == - 1 && return lambertw_branch_one (x, maxits)
50
- throw (DomainError (k, " lambertw: real x must have branch k == 0 or k == -1" ))
51
- end
47
+ _lambertw (x:: Real , k:: Integer , maxits:: Integer ) = _lambertw (x, Val (Int (k)), maxits)
52
48
53
49
# Real x, k = 0
54
50
# There is a magic number here. It could be noted, or possibly removed.
55
51
# In particular, the fancy initial condition selection does not seem to help speed.
56
- function lambertw_branch_zero (x:: T , maxits:: Integer ) where T<: Real
52
+ function _lambertw (x:: T , :: Val{0} , maxits:: Integer ) where T<: Real
57
53
isfinite (x) || return x
58
54
one_t = one (T)
59
55
oneoe = - inv (convert (T, MathConstants. e)) # The branch point
@@ -71,7 +67,7 @@ function lambertw_branch_zero(x::T, maxits::Integer) where T<:Real
71
67
end
72
68
73
69
# Real x, k = -1
74
- function lambertw_branch_one (x:: T , maxits:: Integer ) where T<: Real
70
+ function _lambertw (x:: T , :: Val{-1} , maxits:: Integer ) where T<: Real
75
71
oneoe = - inv (convert (T, MathConstants. e))
76
72
x == oneoe && return - one (T) # W approaches -1 as x -> -1/e from above
77
73
oneoe < x || throw (DomainError (x)) # branch domain exludes x < -1/e
@@ -80,6 +76,9 @@ function lambertw_branch_one(x::T, maxits::Integer) where T<:Real
80
76
return lambertw_root_finding (x, log (- x), maxits)
81
77
end
82
78
79
+ _lambertw (x:: Real , k:: Val , maxits:: Integer ) =
80
+ throw (DomainError (x, " lambertw: for branch k=$k not defined, real x must have branch k == 0 or k == -1" ))
81
+
83
82
# ## Complex z
84
83
85
84
_lambertw (z:: Complex{<:Integer} , k:: Integer , maxits:: Integer ) = _lambertw (float (z), k, maxits)
@@ -285,17 +284,14 @@ function branch_point_series(p::Complex{T}, z::Complex{T}) where T<:Real
285
284
return wser290 (p)
286
285
end
287
286
288
- function _lambertw0 (x:: Number ) # 1 + W(-1/e + x) , k = 0
289
- ps = 2 * MathConstants. e * x
290
- series_arg = sqrt (ps)
291
- branch_point_series (series_arg, x)
292
- end
287
+ _lambertwbp (x:: Number , :: Val{0} ) =
288
+ branch_point_series (sqrt (2 * MathConstants. e * x), x)
293
289
294
- function _lambertwm1 (x:: Number ) # 1 + W(-1/e + x) , k = -1
295
- ps = 2 * MathConstants. e * x
296
- series_arg = - sqrt (ps)
297
- branch_point_series (series_arg, x)
298
- end
290
+ _lambertwbp (x:: Number , :: Val{-1} ) =
291
+ branch_point_series ( - sqrt ( 2 * MathConstants. e * x), x)
292
+
293
+ _lambertwbp (_ :: Number , k :: Val ) =
294
+ throw ( ArgumentError ( " lambertw() expansion about branch point for k= $k not implemented (only implemented for 0 and -1). " ))
299
295
300
296
"""
301
297
lambertwbp(z, k=0)
@@ -323,10 +319,4 @@ julia> convert(Float64, (lambertw(-BigFloat(1)/e + BigFloat(10)^(-18), -1) + 1))
323
319
The loss of precision in `lambertw` is analogous to the loss of precision
324
320
in computing the `sqrt(1-x)` for `x` close to `1`.
325
321
"""
326
- function lambertwbp (x:: Number , k:: Integer )
327
- k == 0 && return _lambertw0 (x)
328
- k == - 1 && return _lambertwm1 (x)
329
- throw (ArgumentError (" expansion about branch point only implemented for k = 0 and -1." ))
330
- end
331
-
332
- lambertwbp (x:: Number ) = _lambertw0 (x)
322
+ lambertwbp (x:: Number , k:: Integer = 0 ) = _lambertwbp (x, Val (Int (k)))
0 commit comments