120 #define Abs(a) (((a)<0)?-(a):(a)) 121 #define Signabs(a,b) ((b)<0?-(a):(a)) 122 #define Sign(a,b) ((b)<0?-Abs(a):Abs(a)) 171 double ax,
double bx,
172 double U,
double (*f)(
double),
double tol) {
174 const double zero = 0.0, one = 1.0, two = 2.0, three = 3.0,
177 static char FIRST = (0 == 0);
178 double a,b,c,e,d,fa,fb,fc,tol1,xm,p,q,r,s,tmp1,tmp2;
197 if (Abs(fc) < Abs(fb)) {
206 tol1 = eps*Abs(b) + half*tol;
208 if (Abs(xm) < tol1 || fb == zero)
return (b);
210 if (Abs(e) < tol1 || Abs(fa) <= Abs(fb)) {
225 p = s*(two*xm*q*(q - r) - (b - a)*(r - one));
226 q = (q - one)*(r - one)*(s - one);
229 if (p > zero) q = -q;
234 if ((two*p) >= (three*xm*q - Abs(tmp1))
235 || (p >= Abs(tmp2))) {
248 if (Abs(d) > tol1) b += d;
249 else b += Signabs(tol1,xm);
252 if ((fb*Signabs(one,fc)) > zero) {
270 double u, ax,bx, fax, fbx;
271 double zero = 0.0, one = 1.0, two = 2.0;
282 if (!isnan(o->
a.
d)) {
293 ax = o->
m.
d - scale*o->
s.
d;
298 if (!isnan(o->
b.
d)) {
309 bx = o->
m.
d + scale*o->
s.
d;
330 static double sqeps = NAN, isqeps, nearzero;
331 double half = 0.5, zero = 0.0, one = 1.0, xp, xm, fp, fm, f0, ret;
346 nearzero = sqeps*sqrt(sqeps);
350 if (-nearzero < x && x < nearzero) {
354 xp = x*(one + sqeps);
355 xm = x*(one - sqeps);
362 ret = (f0-fm)/(x-xm);
363 }
else if (fm == zero) {
365 ret = (fp-f0)/(xp-x);
367 ret = (fp-fm)/(xp-xm);
385 double zero = 0.0, one = 1.0, ret;
399 if (ret < zero || ret > one) {
454 float U,
float (*f)(
float),
float tol) {
456 const float zero = 0.0, one = 1.0, two = 2.0, three = 3.0,
459 static char FIRST = (0 == 0);
460 float a,b,c,e,d,fa,fb,fc,tol1,xm,p,q,r,s,tmp1,tmp2;
479 if (Abs(fc) < Abs(fb)) {
488 tol1 = eps*Abs(b) + half*tol;
490 if (Abs(xm) < tol1 || fb == zero)
return (b);
492 if (Abs(e) < tol1 || Abs(fa) <= Abs(fb)) {
507 p = s*(two*xm*q*(q - r) - (b - a)*(r - one));
508 q = (q - one)*(r - one)*(s - one);
511 if (p > zero) q = -q;
516 if ((two*p) >= (three*xm*q - Abs(tmp1))
517 || (p >= Abs(tmp2))) {
530 if (Abs(d) > tol1) b += d;
531 else b += Signabs(tol1,xm);
534 if ((fb*Signabs(one,fc)) > zero) {
552 float u, ax,bx, fax, fbx;
553 float zero = 0.0, one = 1.0, two = 2.0;
564 if (!isnan(o->
a.
f)) {
575 ax = o->
m.
f - scale*o->
s.
f;
580 if (!isnan(o->
b.
f)) {
591 bx = o->
m.
f + scale*o->
s.
f;
612 static float sqeps = NAN, isqeps, nearzero;
613 float half = 0.5, zero = 0.0, one = 1.0, xp, xm, fp, fm, f0, ret;
628 nearzero = sqeps*sqrtf(sqeps);
632 if (-nearzero < x && x < nearzero) {
636 xp = x*(one + sqeps);
637 xm = x*(one - sqeps);
644 ret = (f0-fm)/(x-xm);
645 }
else if (fm == zero) {
647 ret = (fp-f0)/(xp-x);
649 ret = (fp-fm)/(xp-xm);
667 float zero = 0.0, one = 1.0, ret;
681 if (ret < zero || ret > one) {
float LR_fgetval(char *str)
LR_fgetval(char *val) - return the configure value.
float LRf_zeroin(float ax, float bx, float U, float(*f)(float), float tol)
LRf_zeroin() Routine numerically finds solution to f(x)-U = 0 specialized to CDF()s.
#define LRerr_BadAuxSetup
double LR_dgetval(char *str)
LR_dgetval(char *val) - return the configure value.
float LRf_uinvcdf_CDF(LR_obj *o, float x)
LRf_uinvcdf_CDF(LR_obj *o, float x) - float User supplied cumulative distribution function...
double LRd_zeroin(double ax, double bx, double U, double(*f)(double), double tol)
LRd_zeroin() Routine numerically finds solution to f(x)-U = 0 specialized to CDF()s.
double LRd_uinvcdf_RAN(LR_obj *o)
LRd_uinvcdf_RAN(LR_obj *o) - double random variate via inverse method of the UserCDF() fn...
int LRf_uinvcdf(LR_obj *o, float(*cdf)(float))
LRf_uinvcdf() - set the user defined CDF for this variate distribution.
float LRf_uinvcdf_RAN(LR_obj *o)
LRf_uinvcdf_RAN(LR_obj *o) - float random variate via inverse method of the UserCDF() fn...
#define LRerr_BadDataType
double LRd_uinvcdf_PDF(LR_obj *o, double x)
LRd_uinvcdf_PDF(LR_obj *o, double x) - double probability distribution function approximated from the...
A special object for using a user defined CDF.
int LRd_uinvcdf(LR_obj *o, double(*cdf)(double))
LRd_uinvcdf() - set the user defined CDF for this variate distribution.
#define LRerr_NoAuxiliaryObject
float LRf_uinvcdf_PDF(LR_obj *o, float x)
LRf_uinvcdf_PDF(LR_obj *o, float x) - float probability distribution function approximated from the u...
double LRd_uinvcdf_CDF(LR_obj *o, double x)
LRd_uinvcdf_CDF(LR_obj *o, double x) - double User supplied cumulative distribution function...
The LibRan common header file.
the fundamental LibRan random variate distribution object