@@ -37,7 +37,7 @@ _lambertw(x::Irrational, k::Integer, maxits::Integer) = _lambertw(float(x), k, m
3737function _lambertw (x:: Union{Integer, Rational} , k:: Integer , maxits:: Integer )
3838 if k == 0
3939 x == 0 && return float (zero (x))
40- x == 1 && return convert (typeof (float (x)), omega ) # must be a more efficient way
40+ x == 1 && return convert (typeof (float (x)), LambertW . Omega ) # must be a more efficient way
4141 end
4242 return _lambertw (float (x), k, maxits)
4343end
@@ -141,54 +141,44 @@ function lambertw_root_finding(z::T, x0::T, maxits::Integer) where T <: Number
141141 return x
142142end
143143
144- # ## omega constant
144+ # ## Lambert's Omega constant
145145
146- const _omega_const = 0.567143290409783872999968662210355
147-
148- # The BigFloat `omega_const_bf_` is set via a literal in the function __init__ to prevent a segfault
149-
150- # compute omega constant via root finding
151- # We could compute higher precision. This converges very quickly.
152- function omega_const (:: Type{BigFloat} )
153- precision (BigFloat) <= 256 && return omega_const_bf_[]
146+ # compute BigFloat Omega constant at arbitrary precision
147+ function compute_lambertw_Omega ()
148+ oc = BigFloat (" 0.5671432904097838729999686622103555497538157871865125081351310792230457930866845666932194" )
149+ precision (oc) <= 256 && return oc
150+ # iteratively improve the precision
151+ # see https://en.wikipedia.org/wiki/Omega_constant#Computation
154152 myeps = eps (BigFloat)
155- oc = omega_const_bf_[]
156- for i in 1 : 100
153+ for _ in 1 : 1000
157154 nextoc = (1 + oc) / (1 + exp (oc))
158- abs (oc - nextoc) <= myeps && break
155+ abs (oc - nextoc) <= myeps && return oc
159156 oc = nextoc
160157 end
158+ @warn " Omega precision is less than current BigFloat precision ($(precision (BigFloat)) )"
161159 return oc
162160end
163161
164- """
165- omega
166- ω
162+ # "private" declaration of Omega constant
163+ Base. @irrational lambertw_Omega 0.567143290409783872999968662210355 compute_lambertw_Omega ()
167164
168- The constant defined by `ω exp(ω) = 1`.
165+ module LambertW
169166
170- # Example
171- ```jldoctest
172- julia> ω
173- ω = 0.5671432904097...
174-
175- julia> omega
176- ω = 0.5671432904097...
167+ """
168+ Lambert's Omega (*Ω*) constant.
177169
178- julia> ω * exp(ω)
179- 1.0
170+ Lambert's *Ω* is the solution to *W(Ω) = 1* equation,
171+ where *W(t) = t exp(t)* is the
172+ [Lambert's *W* function](https://en.wikipedia.org/wiki/Lambert_W_function).
180173
181- julia> big(omega)
182- 5.67143290409783872999968662210355549753815787186512508135131079223045793086683e-01
183- ```
174+ # See also
175+ * https://en.wikipedia.org/wiki/Omega_constant
176+ * [`lambertw()`][@ref SpecialFunctions.lambertw]
184177"""
185- const ω = Irrational {:ω } ()
186- @doc ( @doc ω) omega = ω
178+ const Ω = Irrational {:lambertw_Omega } ()
179+ const Omega = Ω # ASCII alias
187180
188- Base. Float64 (:: Irrational{:ω} ) = _omega_const
189- Base. Float32 (:: Irrational{:ω} ) = Float32 (_omega_const)
190- Base. Float16 (:: Irrational{:ω} ) = Float16 (_omega_const)
191- Base. BigFloat (:: Irrational{:ω} ) = omega_const (BigFloat)
181+ end
192182
193183# ## Expansion about branch point x = -1/e
194184
0 commit comments