59 ArgumentType
_raw(
const ArgumentType &z, IndexType
k,
const Policy& pol)
70 if(abs(z+(CoeffType)0.04)<=0.14 && z_imag>=0)
72 w = _N1<ArgumentType,CoeffType>(z);
76 if(abs(z+rec_e<CoeffType>())<0.3 && z_imag>=0)
78 w = _sing<ArgumentType,CoeffType,IndexType>(z,
k);
82 w = _asy<ArgumentType,CoeffType,IndexType>(z,-1);
90 if(abs(z+(CoeffType)0.04)<=0.14 && z_imag<0)
92 w = _N1<ArgumentType,CoeffType>(z);
96 if(abs(z+rec_e<CoeffType>())<0.3 && z_imag<0)
98 w = _sing<ArgumentType,CoeffType,IndexType>(z,
k);
102 w = _asy<ArgumentType,CoeffType,IndexType>(z,1);
110 w = _asy<ArgumentType,CoeffType,IndexType>(z,
k);
114 if(abs(z-(CoeffType)0.02)<0.28)
116 w = _laur<ArgumentType,CoeffType>(z);
120 if(abs(z+rec_e<CoeffType>())<0.3)
122 w = _sing<ArgumentType,CoeffType,IndexType>(z,
k);
126 if(abs(z-(CoeffType)8.)<13)
128 w = _mid<ArgumentType,CoeffType>(z);
132 w = _asy<ArgumentType,CoeffType,IndexType>(z,0);
192 CoeffType err = abs(_test_s<ArgumentType>(z,w,pol));
194 #ifdef BOOST_MATH_LAMBERT_W_NEWTON_ITERATION
195 for(std::size_t cntr = 0; cntr < 3; ++cntr)
197 _iter_newt<ArgumentType,CoeffType,IndexType>(z,
k,w);
201 ArgumentType w_prev = w;
205 #ifdef BOOST_MATH_LAMBERT_W_FRITSCH_ITERATION
210 _iter_frit<ArgumentType,CoeffType,IndexType>(z,
k,w);
211 err = abs(_test_s<ArgumentType>(z,w,pol));
213 while(err < err_prev);
215 _iter_newt<ArgumentType,CoeffType,IndexType>(z,
k,w_prev);
225 ArgumentType w = (ArgumentType)0.;
227 if(boost::math::isnan(z))
229 w = boost::math::policies::raise_evaluation_error<ArgumentType>(
"lambert_w(%1%,IndexType)",
"Argument value %1% is Not-a-Number!",z,pol);
231 else if( (
k == 0 ||
k == -1 ) )
233 if( z < -lambw::rec_e<ArgumentType>())
235 w = boost::math::policies::raise_domain_error<ArgumentType>(
"lambert_w(%1%,IndexType)",
"Argument value %1% out of range for real arguments.", z, pol);
237 else if( (
k == 0) && (z == std::numeric_limits<ArgumentType>::infinity()) )
239 w = boost::math::policies::raise_overflow_error<ArgumentType>(
"lambert_w(%1%,IndexType)",
"Result value overflow for an infinite argument at 0 index.", pol);
245 w = -boost::math::policies::raise_overflow_error<ArgumentType>(
"lambert_w(%1%,IndexType)",
"Result value overflow for 0 argument at -1 index.", pol);
249 w = boost::math::policies::raise_domain_error<ArgumentType>(
"lambert_w(%1%,IndexType)",
"Argument value %1% out of range for real arguments.", z, pol);
253 w = lambw::_raw<ArgumentType,ArgumentType,IndexType>(z, boost::math::round(
k,pol),pol);
258 w = lambw::_raw<ArgumentType,ArgumentType,IndexType>(z, boost::math::round(
k,pol),pol);
263 w = boost::math::policies::raise_domain_error<ArgumentType>(
"lambert_w(%1%,IndexType)",
"Invalid index value of %1% for real arguments. Valid values are 0 and -1.",
k, pol);
266 if(boost::math::isnan(w))
268 return boost::math::policies::raise_evaluation_error<ArgumentType>(
"lambert_w(%1%,IndexType)",
"Function return value %1% is Not-a-Number", w, pol);
270 else if( !(
k == 0 && z == 0.) && w == 0 )
272 return boost::math::policies::raise_underflow_error<ArgumentType>(
"lambert_w(%1%,IndexType)",
"Function return value has underflowed to zero.", pol);
274 else if( !boost::math::isnormal(w) )
276 return boost::math::policies::raise_denorm_error<ArgumentType>(
"lambert_w(%1%,IndexType)",
"Function return value %1% is denormalised.", w, pol);
278 else if( boost::math::isinf(w) )
280 return boost::math::policies::raise_overflow_error<ArgumentType>(
"lambert_w(%1%,IndexType)",
"Result value overflow.", pol);
292 std::complex<ArgumentType> w;
296 w = std::complex<ArgumentType>(
297 boost::math::policies::raise_evaluation_error<ArgumentType>(
298 "lambert_w(%1%,IndexType)",
299 "Argument with real value %1% is Not-a-Number!",
301 std::numeric_limits<ArgumentType>::quiet_NaN());
305 boost::math::policies::raise_overflow_error<ArgumentType>(
306 "lambert_w(%1%,IndexType)",
307 "Argument value overflow.",pol);
308 return std::complex<ArgumentType>(std::numeric_limits<ArgumentType>::quiet_NaN(), std::numeric_limits<ArgumentType>::quiet_NaN());
312 w = std::complex<ArgumentType>(
313 boost::math::policies::raise_pole_error<ArgumentType>(
314 "lambert_w(std::complex<%1%>,IndexType)",
315 "Function has a pole at %1% for indices other than 0.",
317 std::numeric_limits<ArgumentType>::quiet_NaN());
321 w = lambw::_raw<std::complex<ArgumentType>,ArgumentType,IndexType,Policy>(z,boost::math::round(
k,pol),pol);
326 boost::math::policies::raise_evaluation_error<ArgumentType>(
327 "lambert_w(%1%,IndexType)",
328 "Return value with real value %1% is Not-a-Number!",
334 boost::math::policies::raise_overflow_error<ArgumentType>(
335 "lambert_w(%1%,IndexType)",
336 "Return value overflow.",pol);
341 boost::math::policies::raise_denorm_error<ArgumentType>(
342 "lambert_w(%1%,IndexType)",
343 "Return value with real value %1% is denormalised.",
_complex_real(w),pol);