Logo ROOT   6.07/09
Reference Guide
binomial.C
Go to the documentation of this file.
1 /// \file
2 /// \ingroup tutorial_math
3 /// \notebook -nodraw
4 /// tutorial illustrating the use of TMath::Binomial
5 /// can be run with:
6 ///
7 /// ~~~{.cpp}
8 /// root > .x binomial.C
9 /// root > .x binomial.C+ with ACLIC
10 /// ~~~
11 ///
12 /// \macro_output
13 /// \macro_code
14 ///
15 /// \author Federico Carminati
16 
17 #include <TMath.h>
18 #include <TRandom.h>
19 
20 void binomialSimple() {
21  //
22  // Simple test for the binomial distribution
23  //
24  printf("\nTMath::Binomial simple test\n");
25  printf("Build the Tartaglia triangle\n");
26  printf("============================\n");
27  const Int_t max=13;
28  Int_t j;
29  for(Int_t i=0;i<max;i++) {
30  printf("n=%2d",i);
31  for(j=0;j<(max-i);j++) printf(" ");
32  for(j=0;j<i+1;j++) printf("%4d",TMath::Nint(TMath::Binomial(i,j)));
33  printf("\n");
34  }
35 }
36 
37 void binomialFancy() {
38  Double_t x;
39  Double_t y;
40  Double_t res1;
41  Double_t res2;
42  Double_t err;
43  Double_t serr=0;
44  const Int_t nmax=10000;
45  printf("\nTMath::Binomial fancy test\n");
46  printf("Verify Newton formula for (x+y)^n\n");
47  printf("x,y in [-2,2] and n from 0 to 9 \n");
48  printf("=================================\n");
49  TRandom r;
50  for(Int_t i=0; i<nmax; i++) {
51  do {
52  x=2*(1-2*r.Rndm());
53  y=2*(1-2*r.Rndm());
54  } while (TMath::Abs(x+y)<0.75); //Avoid large cancellations
55  for(Int_t j=0; j<10; j++) {
56  res1=TMath::Power(x+y,j);
57  res2=0;
58  for(Int_t k=0; k<=j; k++)
59  res2+=TMath::Power(x,k)*TMath::Power(y,j-k)*TMath::Binomial(j,k);
60  if((err=TMath::Abs(res1-res2)/TMath::Abs(res1))>1e-10)
61  printf("res1=%e res2=%e x=%e y=%e err=%e j=%d\n",res1,res2,x,y,err,j);
62  serr +=err;
63  }
64  }
65  printf("Average Error = %e\n",serr/nmax);
66 }
67 
68 void binomial () {
69  binomialSimple();
70  binomialFancy();
71 }
72 
int Int_t
Definition: RtypesCore.h:41
Short_t Abs(Short_t d)
Definition: TMathBase.h:110
LongDouble_t Power(LongDouble_t x, LongDouble_t y)
Definition: TMath.h:501
Double_t x[n]
Definition: legend1.C:17
This is the base class for the ROOT Random number generators.
Definition: TRandom.h:31
virtual Double_t Rndm()
Machine independent random number generator.
Definition: TRandom.cxx:512
TRandom2 r(17)
Double_t Binomial(Int_t n, Int_t k)
Calculate the binomial coefficient n over k.
Definition: TMath.cxx:2076
double Double_t
Definition: RtypesCore.h:55
Double_t y[n]
Definition: legend1.C:17
you should not use this method at all Int_t Int_t Double_t Double_t Double_t e
Definition: TRolke.cxx:630
Int_t Nint(T x)
Definition: TMath.h:480