29 #ifndef ROOT_TMathBase
54 inline Double_t E() {
return 2.71828182845904523536; }
181 template <
typename T>
183 inline static T Min();
184 inline static T Max();
211 template <
typename Iterator> Iterator
LocMin(Iterator
first, Iterator last);
213 template <
typename Iterator> Iterator
LocMax(Iterator
first, Iterator last);
218 template <
typename Iterator,
typename Element> Iterator
BinarySearch(Iterator
first, Iterator last, Element
value);
225 template <
typename Element,
typename Index>
227 template <
typename Iterator,
typename IndexIterator>
247 template <
typename T>
T *
Cross(
const T v1[3],
const T v2[3],
T out[3]);
256 template <
typename T>
T *
Normal2Plane(
const T v1[3],
const T v2[3],
const T v3[3],
T normal[3]);
302 template <
typename Iterator,
typename WeightIterator>
Double_t Mean(Iterator
first, Iterator last, WeightIterator wfirst);
309 template <
typename Iterator,
typename WeightIterator>
Double_t RMS(Iterator
first, Iterator last, WeightIterator wfirst);
313 template <
typename Iterator,
typename WeightIterator>
Double_t StdDev(Iterator
first, Iterator last, WeightIterator wfirst) {
return RMS<Iterator,WeightIterator>(
first,last,wfirst); }
318 template <
class Element,
typename Size> Element
KOrdStat(
Size n,
const Element *
a,
Size k,
Size *work = 0);
363 #if defined(R__WIN32) && !defined(__CINT__)
365 # define finite _finite
366 # define isnan _isnan
369 #if defined(R__AIX) || defined(R__SOLARIS_CC50) || \
370 defined(R__HPUX11) || defined(R__GLIBC) || \
371 (defined(R__MACOSX) && (defined(__INTEL_COMPILER) || defined(__arm__)))
374 # ifdef R__SOLARIS_CC50
375 extern "C" {
int finite(
double); }
388 extern double sin(
double);
389 extern double cos(
double);
390 extern double tan(
double);
391 extern double sinh(
double);
392 extern double cosh(
double);
393 extern double tanh(
double);
394 extern double asin(
double);
395 extern double acos(
double);
396 extern double atan(
double);
397 extern double atan2(
double,
double);
398 extern double sqrt(
double);
399 extern double exp(
double);
400 extern double pow(
double,
double);
401 extern double log(
double);
402 extern double log10(
double);
404 # if !defined(finite)
405 extern int finite(
double);
408 extern int isnan(
double);
410 extern double ldexp(
double,
int);
411 extern double ceil(
double);
412 extern double floor(
double);
414 _CRTIMP
double ldexp(
double,
int);
415 _CRTIMP
double ceil(
double);
416 _CRTIMP
double floor(
double);
447 if (x > 1.)
return 0;
455 {
if (x != 0)
return atan2(y, x);
456 if (y == 0)
return 0;
457 if (y > 0)
return Pi()/2;
487 if ( i & 1 && x + 0.5 ==
T(i) ) i--;
490 if ( i & 1 && x - 0.5 ==
T(i) ) i++;
499 {
return ldexp(x, exp); }
508 #if __cplusplus >= 201103
515 {
return pow(x, y); }
533 #if defined(R__FAST_MATH)
539 const unsigned long long mask = 0x7FF0000000000000LL;
540 union {
unsigned long long l;
double d;}
v;
542 return (
v.l&mask)!=mask;
545 # if defined(R__HPUX11)
547 # elif defined(R__MACOSX)
560 #if defined (R__FAST_MATH)
566 namespace detailsForFastMath {
590 } ieee_double_shape_type;
592 #define EXTRACT_WORDS(ix0,ix1,d) \
594 ieee_double_shape_type ew_u; \
596 (ix0) = ew_u.parts.msw; \
597 (ix1) = ew_u.parts.lsw; \
600 inline int IsNaN(
double x)
603 ieee_double_shape_type ew_u;
608 EXTRACT_WORDS(hx, lx, x);
612 return (hx == 0x7ff00000) && (lx != 0);
618 #if defined(R__FAST_MATH)
621 # if (defined(R__ANSISTREAM) || (defined(R__MACOSX) && defined(__arm__))) && !defined(_AIX) && !defined(__CUDACC__)
622 # if defined(isnan) || defined(R__SOLARIS_CC50) || defined(__INTEL_COMPILER)
638 return std::numeric_limits<Double_t>::quiet_NaN();
645 return std::numeric_limits<Double_t>::signaling_NaN();
680 template <
typename T>
684 return *std::min_element(a,a+n);
687 template <
typename T>
691 return *std::max_element(a,a+n);
694 template <
typename T>
704 if (n <= 0 || !a)
return -1;
716 template <
typename Iterator>
720 return std::min_element(first, last);
723 template <
typename T>
730 if (n <= 0 || !a)
return -1;
742 template <
typename Iterator>
748 return std::max_element(first, last);
756 template<
typename Index>
769 template<
typename Index>
777 template <
typename Iterator>
784 while ( first != last )
794 template <
typename Iterator,
typename WeightIterator>
804 while ( first != last ) {
806 ::Error(
"TMath::Mean",
"w[%d] = %.4e < 0 ?!",i,*w);
809 sum += (*w) * (*first);
816 ::Error(
"TMath::Mean",
"sum of weights == 0 ?!");
823 template <
typename T>
835 template <
typename Iterator>
843 while ( first != last ) {
844 if (*first == 0)
return 0.;
854 template <
typename T>
863 template <
typename Iterator>
878 while ( first != last ) {
880 tot += (x - mean)*(x - mean);
888 template <
typename Iterator,
typename WeightIterator>
901 while ( first != last ) {
904 sumw2 += (*w) * (*w);
905 tot += (*w) * (x - mean)*(x - mean);
915 template <
typename T>
925 template <
typename Iterator,
typename Element>
936 pind = std::lower_bound(first, last, value);
937 if ( (pind != last) && (*pind == value) )
953 pind = std::lower_bound(array, array + n, value);
954 if ( (pind != array + n) && (*pind == value) )
955 return (pind - array);
957 return ( pind - array - 1);
969 pind = std::lower_bound(*array, *array + n, value);
970 if ( (pind != *array + n) && (*pind == value) )
971 return (pind - *array);
973 return ( pind - *array - 1);
976 template <
typename Iterator,
typename IndexIterator>
989 IndexIterator cindex = index;
990 for ( Iterator cfirst = first; cfirst != last; ++cfirst )
1013 for(
Index i = 0; i <
n; i++) { index[i] = i; }
1025 out[0] = v1[1] * v2[2] - v1[2] * v2[1];
1026 out[1] = v1[2] * v2[0] - v1[0] * v2[2];
1027 out[2] = v1[0] * v2[1] - v1[1] * v2[0];
1044 v1[0] = p2[0] - p1[0];
1045 v1[1] = p2[1] - p1[1];
1046 v1[2] = p2[2] - p1[2];
1048 v2[0] = p3[0] - p1[0];
1049 v2[1] = p3[1] - p1[1];
1050 v2[2] = p3[2] - p1[2];
1065 for (i=0; i<
np; i++) {
1066 if ((y[i]<yp && y[j]>=yp) || (y[j]<yp && y[i]>=yp)) {
1067 if (x[i]+(yp-y[i])/(y[j]-y[i])*(x[j]-x[i])<xp) {
1068 oddNodes = !oddNodes;
1100 const Int_t kWorkMax = 100;
1102 if (n <= 0 || !a)
return 0;
1113 isAllocated =
kTRUE;
1120 for (
Int_t j = 0; j <
n; j++) {
1122 ::Error(
"TMath::Median",
"w[%d] = %.4e < 0 ?!",j,w[j]);
1123 if (isAllocated)
delete [] ind;
1135 for (jl = 0; jl <
n; jl++) {
1137 if (sum >= sumTot2)
break;
1142 for (jh = n-1; jh >= 0; jh--) {
1144 if (sum <= sumTot2)
break;
1147 median = 0.5*(a[ind[jl]]+a[ind[jh]]);
1166 template <
class Element,
typename Size>
1188 const Int_t kWorkMax = 100;
1193 Size i, ir, j,
l, mid;
1196 Index workLocal[kWorkMax];
1204 isAllocated =
kTRUE;
1217 if (ir == l+1 && a[ind[ir]]<a[ind[l]])
1218 {temp = ind[
l]; ind[
l]=ind[ir]; ind[ir]=temp;}
1219 Element tmp = a[ind[rk]];
1225 {temp = ind[mid]; ind[mid]=ind[l+1]; ind[l+1]=temp;}
1226 if (a[ind[l]]>a[ind[ir]])
1227 {temp = ind[
l]; ind[
l]=ind[ir]; ind[ir]=temp;}
1229 if (a[ind[l+1]]>a[ind[ir]])
1230 {temp=ind[l+1]; ind[l+1]=ind[ir]; ind[ir]=temp;}
1232 if (a[ind[l]]>a[ind[l+1]])
1233 {temp = ind[
l]; ind[
l]=ind[l+1]; ind[l+1]=temp;}
1239 do i++;
while (a[ind[i]]<a[arr]);
1240 do j--;
while (a[ind[j]]>a[arr]);
1242 {temp=ind[i]; ind[i]=ind[j]; ind[j]=temp;}
1246 if (j>=rk) ir = j-1;
Double_t BesselI(Int_t n, Double_t x)
Compute the Integer Order Modified Bessel function I_n(x) for n=0,1,2,...
Double_t FDist(Double_t F, Double_t N, Double_t M)
Computes the density function of F-distribution (probability function, integral of density...
Double_t Landau(Double_t x, Double_t mpv=0, Double_t sigma=1, Bool_t norm=kFALSE)
The LANDAU function.
Double_t ErfInverse(Double_t x)
returns the inverse error function x must be <-1<x<1
Double_t BreitWigner(Double_t x, Double_t mean=0, Double_t gamma=1)
Calculate a Breit Wigner function with mean and gamma.
Double_t FDistI(Double_t F, Double_t N, Double_t M)
Calculates the cumulative distribution function of F-distribution, this function occurs in the statis...
static Vc_ALWAYS_INLINE int_v min(const int_v &x, const int_v &y)
Double_t PoissonI(Double_t x, Double_t par)
compute the Poisson distribution function for (x,par) This is a non-smooth function.
Double_t Floor(Double_t x)
Float_t Normalize(Float_t v[3])
Normalize a vector v in place.
Long64_t LocMax(Long64_t n, const T *a)
bool operator()(Index i1, Index i2)
static double p3(double t, double a, double b, double c, double d)
Double_t KolmogorovProb(Double_t z)
Calculates the Kolmogorov distribution function, Begin_Html.
Double_t HbarUncertainty()
Double_t LaplaceDistI(Double_t x, Double_t alpha=0, Double_t beta=1)
Computes the distribution function of Laplace distribution at point x, with location parameter alpha ...
Double_t StudentQuantile(Double_t p, Double_t ndf, Bool_t lower_tail=kTRUE)
Computes quantiles of the Student's t-distribution 1st argument is the probability, at which the quantile is computed 2nd argument - the number of degrees of freedom of the Student distribution When the 3rd argument lower_tail is kTRUE (default)- the algorithm returns such x0, that P(x < x0)=p upper tail (lower_tail is kFALSE)- the algorithm returns such x0, that P(x > x0)=p the algorithm was taken from G.W.Hill, "Algorithm 396, Student's t-quantiles" "Communications of the ACM", 13(10), October 1970.
Double_t NormQuantile(Double_t p)
Computes quantiles for standard normal distribution N(0, 1) at probability p ALGORITHM AS241 APPL...
Double_t BetaDist(Double_t x, Double_t p, Double_t q)
Computes the probability density function of the Beta distribution (the distribution function is comp...
Double_t LaplaceDist(Double_t x, Double_t alpha=0, Double_t beta=1)
Computes the probability density function of Laplace distribution at point x, with location parameter...
Double_t Log2(Double_t x)
Double_t StruveH1(Double_t x)
Struve Functions of Order 1.
void BubbleHigh(Int_t Narr, Double_t *arr1, Int_t *arr2)
Bubble sort variant to obtain the order of an array's elements into an index in order to do more usef...
Int_t FloorNint(Double_t x)
Double_t Gamma(Double_t z)
Computation of gamma(z) for all z.
Double_t GeomMean(Long64_t n, const T *a)
Double_t BesselJ1(Double_t x)
Returns the Bessel function J1(x) for any real x.
static Vc_ALWAYS_INLINE Vector< T >::Mask isfinite(const Vector< T > &x)
Double_t Prob(Double_t chi2, Int_t ndf)
Computation of the probability for a certain Chi-squared (chi2) and number of degrees of freedom (ndf...
Double_t StudentI(Double_t T, Double_t ndf)
Calculates the cumulative distribution function of Student's t-distribution second parameter stands f...
LongDouble_t Power(LongDouble_t x, LongDouble_t y)
double beta(double x, double y)
Calculates the beta function.
Double_t Ldexp(Double_t x, Int_t exp)
T * Normal2Plane(const T v1[3], const T v2[3], const T v3[3], T normal[3])
Double_t RMS(Long64_t n, const T *a, const Double_t *w=0)
T NormCross(const T v1[3], const T v2[3], T out[3])
Double_t BesselY1(Double_t x)
Returns the Bessel function Y1(x) for positive x.
Double_t ChisquareQuantile(Double_t p, Double_t ndf)
Evaluate the quantiles of the chi-squared probability distribution function.
void Quantiles(Int_t n, Int_t nprob, Double_t *x, Double_t *quantiles, Double_t *prob, Bool_t isSorted=kTRUE, Int_t *index=0, Int_t type=7)
Computes sample quantiles, corresponding to the given probabilities Parameters: x -the data sample n ...
Double_t Log10(Double_t x)
Double_t BesselI1(Double_t x)
Compute the modified Bessel function I_1(x) for any real x.
static double p2(double t, double a, double b, double c)
Double_t Freq(Double_t x)
Computation of the normal frequency function freq(x).
double pow(double, double)
bool operator()(Index i1, Index i2)
void Sort(Index n, const Element *a, Index *index, Bool_t down=kTRUE)
Double_t ATan2(Double_t, Double_t)
Bool_t IsInside(T xp, T yp, Int_t np, T *x, T *y)
void BubbleLow(Int_t Narr, Double_t *arr1, Int_t *arr2)
Opposite ordering of the array arr2[] to that of BubbleHigh.
void Error(const char *location, const char *msgfmt,...)
Double_t Erfc(Double_t x)
Compute the complementary error function erfc(x).
Double_t SigmaUncertainty()
Double_t DiLog(Double_t x)
The DiLogarithm function Code translated by R.Brun from CERNLIB DILOG function C332.
Double_t Normalize(Double_t v[3])
Normalize a vector v in place.
Bool_t AreEqualAbs(Double_t af, Double_t bf, Double_t epsilon)
Bool_t AreEqualRel(Double_t af, Double_t bf, Double_t relPrec)
Double_t VavilovI(Double_t x, Double_t kappa, Double_t beta2)
Returns the value of the Vavilov distribution function Parameters: 1st - the point were the density f...
Double_t BesselY0(Double_t x)
Returns the Bessel function Y0(x) for positive x.
Double_t Erf(Double_t x)
Computation of the error function erf(x).
Double_t BetaDistI(Double_t x, Double_t p, Double_t q)
Computes the distribution function of the Beta distribution.
Double_t StruveL1(Double_t x)
Modified Struve Function of Order 1.
Double_t Voigt(Double_t x, Double_t sigma, Double_t lg, Int_t r=4)
Computation of Voigt function (normalised).
Bool_t Permute(Int_t n, Int_t *a)
Simple recursive algorithm to find the permutations of n natural numbers, not necessarily all distinc...
Double_t StruveL0(Double_t x)
Modified Struve Function of Order 0.
Double_t Mean(Long64_t n, const T *a, const Double_t *w=0)
Double_t KolmogorovTest(Int_t na, const Double_t *a, Int_t nb, const Double_t *b, Option_t *option)
Statistical test whether two one-dimensional sets of points are compatible with coming from the same ...
Double_t Binomial(Int_t n, Int_t k)
Calculate the binomial coefficient n over k.
Double_t LandauI(Double_t x)
Returns the value of the Landau distribution function at point x.
Double_t BesselJ0(Double_t x)
Returns the Bessel function J0(x) for any real x.
static double p1(double t, double a, double b)
Double_t ErfcInverse(Double_t x)
T * Cross(const T v1[3], const T v2[3], T out[3])
ULong_t Hash(const void *txt, Int_t ntxt)
Calculates hash index from any char string.
Double_t GhbarCUncertainty()
Double_t Poisson(Double_t x, Double_t par)
compute the Poisson distribution function for (x,par) The Poisson PDF is implemented by means of Eule...
Double_t Student(Double_t T, Double_t ndf)
Computes density function for Student's t- distribution (the probability function (integral of densit...
Double_t Beta(Double_t p, Double_t q)
Calculates Beta-function Gamma(p)*Gamma(q)/Gamma(p+q).
Double_t Gaus(Double_t x, Double_t mean=0, Double_t sigma=1, Bool_t norm=kFALSE)
Calculate a gaussian function with mean and sigma.
Double_t BesselI0(Double_t x)
Compute the modified Bessel function I_0(x) for any real x.
Double_t BesselK(Int_t n, Double_t x)
Compute the Integer Order Modified Bessel function K_n(x) for n=0,1,2,...
Double_t StdDev(Long64_t n, const T *a, const Double_t *w=0)
RooCmdArg Index(RooCategory &icat)
Double_t StruveH0(Double_t x)
Struve Functions of Order 0.
double atan2(double, double)
Double_t Median(Long64_t n, const T *a, const Double_t *w=0, Long64_t *work=0)
T MaxElement(Long64_t n, const T *a)
Double_t Hypot(Double_t x, Double_t y)
static Vc_ALWAYS_INLINE int_v max(const int_v &x, const int_v &y)
Double_t BesselK0(Double_t x)
Compute the modified Bessel function K_0(x) for positive real x.
Double_t BinomialI(Double_t p, Int_t n, Int_t k)
Suppose an event occurs with probability p per trial Then the probability P of its occuring k or more...
Double_t BetaCf(Double_t x, Double_t a, Double_t b)
Continued fraction evaluation by modified Lentz's method used in calculation of incomplete Beta funct...
Element KOrdStat(Size n, const Element *a, Size k, Size *work=0)
Double_t GammaDist(Double_t x, Double_t gamma, Double_t mu=0, Double_t beta=1)
Computes the density function of Gamma distribution at point x.
Double_t Factorial(Int_t i)
Compute factorial(n).
Double_t Ceil(Double_t x)
Double_t BesselK1(Double_t x)
Compute the modified Bessel function K_1(x) for positive real x.
Double_t LnGamma(Double_t z)
Computation of ln[gamma(z)] for all z.
Double_t LogNormal(Double_t x, Double_t sigma, Double_t theta=0, Double_t m=1)
Computes the density of LogNormal distribution at point x.
TGLVector3 Cross(const TGLVector3 &v1, const TGLVector3 &v2)
Bool_t RootsCubic(const Double_t coef[4], Double_t &a, Double_t &b, Double_t &c)
Calculates roots of polynomial of 3rd order a*x^3 + b*x^2 + c*x + d, where a == coef[3], b == coef[2], c == coef[1], d == coef[0] coef[3] must be different from 0 If the boolean returned by the method is false: ==> there are 3 real roots a,b,c If the boolean returned by the method is true: ==> there is one real root a and 2 complex conjugates roots (b+i*c,b-i*c) Author: Francois-Xavier Gentit.
Double_t Sqrt(Double_t x)
Double_t BetaIncomplete(Double_t x, Double_t a, Double_t b)
Calculates the incomplete Beta-function.
Long64_t LocMin(Long64_t n, const T *a)
Double_t CauchyDist(Double_t x, Double_t t=0, Double_t s=1)
Computes the density of Cauchy distribution at point x by default, standard Cauchy distribution is us...
double norm(double *x, double *p)
Int_t CeilNint(Double_t x)
Long64_t BinarySearch(Long64_t n, const T *array, T value)
double ldexp(double, int)
void SortItr(Iterator first, Iterator last, IndexIterator index, Bool_t down=kTRUE)
Double_t Vavilov(Double_t x, Double_t kappa, Double_t beta2)
Returns the value of the Vavilov density function Parameters: 1st - the point were the density functi...
T MinElement(Long64_t n, const T *a)