More exact rounding function, but also much slower.
authorloizides <loizides@f7af4fe6-9843-0410-8265-dc069ae4e863>
Sun, 7 Jul 2002 08:30:29 +0000 (08:30 +0000)
committerloizides <loizides@f7af4fe6-9843-0410-8265-dc069ae4e863>
Sun, 7 Jul 2002 08:30:29 +0000 (08:30 +0000)
HLT/misc/AliL3FFloat.cxx
HLT/misc/AliL3FFloat.h
HLT/misc/Makefile

index 150c81c153bccc285bbc6217c8640ba21b7c9be2..801b134ff887a928a954e7d0e1af6500f02d53b7 100644 (file)
 //</pre>
  */
 
-
 ClassImp(AliL3FFloat)
 
-Int_t AliL3FFloat::fDigits =  DEFDIG;
-Int_t AliL3FFloat::fMax = DEFMAX;
-Int_t AliL3FFloat::fMin = DEFMIN;
-
-Int_t AliL3FFloat::fN = 0;
-Int_t AliL3FFloat::fNRounded = 0;
-Int_t AliL3FFloat::fNOpAdds = 0;
-Int_t AliL3FFloat::fNOpMults = 0;
-Int_t AliL3FFloat::fNOpDivs = 0;
-Int_t AliL3FFloat::fNOpSubs = 0;
-Int_t AliL3FFloat::fNOverFlow = 0;
+Int_t AliL3FFloat::fDigits = DEFDIG;
+Int_t AliL3FFloat::fMax    = DEFMAX;
+Int_t AliL3FFloat::fMin    = DEFMIN;
+Char_t AliL3FFloat::fQuery[10] = "%.2f";
+
+#ifdef CALCSTATS
+Int_t AliL3FFloat::fN          = 0;
+Int_t AliL3FFloat::fNRounded   = 0;
+Int_t AliL3FFloat::fNOpAdds    = 0;
+Int_t AliL3FFloat::fNOpMults   = 0;
+Int_t AliL3FFloat::fNOpDivs    = 0;
+Int_t AliL3FFloat::fNOpSubs    = 0;
+Int_t AliL3FFloat::fNOverFlow  = 0;
 Int_t AliL3FFloat::fNUnderFlow = 0;
+Double_t AliL3FFloat::fNDiff   = 0;
+#endif
+
+
+AliL3FFloat::~AliL3FFloat()
+{
+#ifdef CALCSTATS
+  fNDiff+=fabs(fVal-fExactVal);
+#endif
+}
 
 ostream& operator<<(ostream &os, const AliL3FFloat &f) 
 {
   //  os << (Double_t)f << endl; 
-  os << (Double_t)f << "(" << f.fExactVal << ")" << endl
+  os << (Double_t)f << "(" << f.fExactVal << ")"; 
   return os;
 }
 
@@ -82,7 +93,7 @@ AliL3FFloat operator + (const AliL3FFloat &f)
 AliL3FFloat operator - (const AliL3FFloat &f1,const AliL3FFloat &f2)
 {
   AliL3FFloat r(f1); 
-  r+=f2; 
+  r-=f2; 
   return r;
 }
 
@@ -113,6 +124,20 @@ AliL3FFloat operator * (const AliL3FFloat &f1,const AliL3FFloat &f2)
   return r;
 }
 
+AliL3FFloat operator * (const AliL3FFloat &f1,const Double_t f2)
+{
+  AliL3FFloat r(f1); 
+  r*=f2; 
+  return r;
+}
+
+AliL3FFloat operator * (const Double_t f1,const AliL3FFloat &f2)
+{
+  AliL3FFloat r(f1); 
+  r*=f2; 
+  return r;
+}
+
 AliL3FFloat operator / (const AliL3FFloat &f1,const AliL3FFloat &f2)
 {
   AliL3FFloat r(f1); 
@@ -120,12 +145,28 @@ AliL3FFloat operator / (const AliL3FFloat &f1,const AliL3FFloat &f2)
   return r;
 }
 
+AliL3FFloat operator / (const AliL3FFloat &f1,const Double_t f2)
+{
+  AliL3FFloat r(f1); 
+  r/=f2; 
+  return r;
+}
+
+AliL3FFloat operator / (const Double_t f1,const AliL3FFloat &f2)
+{
+  AliL3FFloat r(f1); 
+  r/=f2; 
+  return r;
+}
+
 AliL3FFloat& AliL3FFloat::operator += (const AliL3FFloat &f)
 {
   Double_t ev=fExactVal+f.GetExactVal();
   Set(fVal+(Double_t)f); 
   fExactVal=ev;
+#ifdef CALCSTATS
   fNOpAdds++; 
+#endif
   return *this;
 }
 
@@ -134,7 +175,9 @@ AliL3FFloat& AliL3FFloat::operator += (const Double_t f)
   Double_t ev=fExactVal+f;
   Set(fVal+Round(f));   
   fExactVal=ev;
+#ifdef CALCSTATS
   fNOpAdds++; 
+#endif
   return *this;
 }
 
@@ -143,7 +186,9 @@ AliL3FFloat& AliL3FFloat::operator -= (const AliL3FFloat &f)
   Double_t ev=fExactVal-f.GetExactVal();
   Set(fVal-(Double_t)f);
   fExactVal=ev;
+#ifdef CALCSTATS
   fNOpSubs++; 
+#endif
   return *this;
 }
 
@@ -152,7 +197,9 @@ AliL3FFloat& AliL3FFloat::operator -= (const Double_t f)
   Double_t ev=fExactVal-f;
   Set(fVal-Round(f)); 
   fExactVal=ev;
+#ifdef CALCSTATS
   fNOpSubs++; 
+#endif
   return *this;
 }
 
@@ -161,7 +208,9 @@ AliL3FFloat& AliL3FFloat::operator *= (const AliL3FFloat &f)
   Double_t ev=fExactVal*f.GetExactVal();
   Set(fVal*(Double_t)f);
   fExactVal=ev;
+#ifdef CALCSTATS
   fNOpMults++;
+#endif
   return *this;
 }
 
@@ -170,7 +219,9 @@ AliL3FFloat& AliL3FFloat::operator *= (const Double_t f)
   Double_t ev=fExactVal*f;
   Set(fVal*Round(f));   
   fExactVal=ev;
+#ifdef CALCSTATS
   fNOpMults++;
+#endif
   return *this;
 }
 
@@ -179,7 +230,9 @@ AliL3FFloat& AliL3FFloat::operator /= (const AliL3FFloat &f)
   Double_t ev=fExactVal/f.GetExactVal();
   Set(fVal/(Double_t)f);
   fExactVal=ev;
+#ifdef CALCSTATS
   fNOpDivs++; 
+#endif
   return *this;
 }
 
@@ -188,50 +241,75 @@ AliL3FFloat& AliL3FFloat::operator /= (const Double_t f)
   Double_t ev=fExactVal/f;
   Set(fVal/Round(f));   
   fExactVal=ev;
+#ifdef CALCSTATS
   fNOpDivs++; 
+#endif
   return *this;
 }
 
-void AliL3FFloat::Set(Double_t val)
+inline void AliL3FFloat::Set(Double_t val)
 {
   fVal=Round(val);
   fExactVal=val;
   CheckBounds();
+#ifdef CALCSTATS
   fN++;
+#endif
 }
 
-void AliL3FFloat::Set(AliL3FFloat &f)
+inline void AliL3FFloat::Set(AliL3FFloat &f)
 {
   fVal=(Double_t)f;
   fExactVal=f.GetExactVal();
   CheckBounds();
+#ifdef CALCSTATS
   fN++;
+#endif
 }
 
-Double_t AliL3FFloat::Round(Double_t val)
+#ifdef FASTWITHROUNDINDERROS
+inline Double_t AliL3FFloat::Round(Double_t val)
 {
   Int_t dummy=Int_t(fDigits*val);
   Double_t ret=(Double_t)(dummy)/fDigits;
+#ifdef CALCSTATS
   if(ret!=val) fNRounded++;
+#endif
   return ret;
 }
+#else
+inline Double_t AliL3FFloat::Round(Double_t val)
+{
+  static Char_t strnum[100];
+  sprintf(strnum,fQuery,val);
+  Double_t ret=atof(strnum);
+#ifdef CALCSTATS
+  if(ret!=val) fNRounded++;
+#endif
+  return ret;
+}
+#endif
 
-Bool_t AliL3FFloat::CheckUpperBound()
+inline Bool_t AliL3FFloat::CheckUpperBound()
 {
   if(fVal>fMax){
     fVal=fMax;
+#ifdef CALCSTATS
     fNOverFlow++;
+#endif
     return kFALSE;
   }
 
   return kTRUE;
 }
 
-Bool_t AliL3FFloat::CheckLowerBound()
+inline Bool_t AliL3FFloat::CheckLowerBound()
 {
   if(fVal<fMin){
     fVal=fMin;
+#ifdef CALCSTATS
     fNUnderFlow++;
+#endif
     return kFALSE;
   }
 
@@ -241,11 +319,15 @@ Bool_t AliL3FFloat::CheckLowerBound()
 void AliL3FFloat::SetParams(Int_t dig,Int_t min,Int_t max)
 {
   fDigits=dig;
+  Int_t prec=0;
+  if(fDigits>0) prec=(Int_t)log10(fDigits);
+  sprintf(fQuery,"%%.%df",prec);
   fMin=min;
   fMax=max;
 }
 
 void AliL3FFloat::PrintStat(){
+#ifdef CALCSTATS
   cout << "fN:            " << fN << endl;
   cout << "fNRounded:     " << fNRounded << endl;
   cout << "fNOpAdds:      " << fNOpAdds << endl;
@@ -254,4 +336,9 @@ void AliL3FFloat::PrintStat(){
   cout << "fNOpDivs:      " << fNOpDivs << endl;
   cout << "fNOpOverFlow:  " << fNOverFlow << endl;
   cout << "fNOpUnderFlow: " << fNUnderFlow << endl;
+  if(fN) cout << "fNDiff:        " << fNDiff/fN << endl;
+#else
+  cerr << "Not compiled with #define CALCSTATS!" << endl;
+#endif
+
 }
index a484df85cdd2b5fcce0330c47b23f871e081c241..489922bfb5d29cb2133cc84f39870166fc15826d 100644 (file)
@@ -7,16 +7,24 @@
 #define DEFMIN -1000000
 #define DEFMAX  1000000
 
+#define CALCSTATS
+//#define FASTWITHROUNDINDERROS
+
 class AliL3FFloat {
  public:
-  AliL3FFloat(Double_t val=0) {Set(val);}
-  AliL3FFloat(AliL3FFloat &f) {Set(f);  }
+  AliL3FFloat(Double_t val=0)       {Set(val);}
+  AliL3FFloat(const AliL3FFloat &f) {Set(f);}
+  virtual ~AliL3FFloat();
+
+  AliL3FFloat& operator = (const AliL3FFloat &f)  {Set(f); return *this;}
+  AliL3FFloat& operator = (const Double_t f)      {Set(f); return *this;}
 
-  operator const Float_t  () const {return (Float_t)fVal;}
   operator const Double_t () const {return fVal;}
+  operator const Float_t  () const {return (Float_t)fVal;}
+  operator const Int_t  () const {return (Int_t)fVal;}
+
   friend ostream& operator<<(ostream &os, const AliL3FFloat &f);
-  //AliL3FFloat& operator = (const AliL3FFloat &f)  {Set(f); return *this;}
-  //AliL3FFloat& operator = (const Double_t f)      {Set(f); return *this;}
+
   friend AliL3FFloat operator + (const AliL3FFloat &f1,const AliL3FFloat &f2);
   friend AliL3FFloat operator + (const AliL3FFloat &f1,const Double_t f2);
   friend AliL3FFloat operator + (const Double_t f1,    const AliL3FFloat &f2);
@@ -26,7 +34,11 @@ class AliL3FFloat {
   friend AliL3FFloat operator - (const Double_t f1,    const AliL3FFloat &f2);
   friend AliL3FFloat operator - (const AliL3FFloat &f1);
   friend AliL3FFloat operator * (const AliL3FFloat &f1,const AliL3FFloat &f2);
+  friend AliL3FFloat operator * (const AliL3FFloat &f1,const Double_t f2);
+  friend AliL3FFloat operator * (const Double_t f1,    const AliL3FFloat &f2);
   friend AliL3FFloat operator / (const AliL3FFloat &f1,const AliL3FFloat &f2);
+  friend AliL3FFloat operator / (const AliL3FFloat &f1,const Double_t f2);
+  friend AliL3FFloat operator / (const Double_t f1,    const AliL3FFloat &f2);
 
   AliL3FFloat& operator += (const AliL3FFloat &f);
   AliL3FFloat& operator += (const Double_t f);
@@ -37,6 +49,9 @@ class AliL3FFloat {
   AliL3FFloat& operator /= (const AliL3FFloat &f);
   AliL3FFloat& operator /= (const Double_t f);
 
+  //==,!=,>=, ...
+  //++,--
+
   static void PrintStat();
   static void SetParams(Int_t dig=DEFDIG,Int_t min=DEFMIN,Int_t max=DEFMAX);
   void Set(Double_t f=0);
@@ -55,9 +70,11 @@ class AliL3FFloat {
   Double_t fExactVal;
 
   static Int_t fDigits;
+  static Char_t fQuery[10];
   static Int_t fMax;
   static Int_t fMin;
 
+#ifdef CALCSTATS
   static Int_t fN;
   static Int_t fNRounded;
   static Int_t fNOpAdds;
@@ -66,6 +83,8 @@ class AliL3FFloat {
   static Int_t fNOpSubs;
   static Int_t fNOverFlow;
   static Int_t fNUnderFlow;
+  static Double_t fNDiff;
+#endif
 
   ClassDef(AliL3FFloat,1)
 };
index 6f2cf0cbdb8ee262fe917c9c88c6f410241f0e2d..ecbb97fa29fd92b1cdc876e2c96d00e937e87317 100644 (file)
@@ -24,7 +24,7 @@ endif
 
 ifeq ($(USEPACKAGE),ALIROOT)
 INCLUDES = -I$(ROOTSYS)/include -I$(TOPDIR)/hough -I$(TOPDIR)/src -I$(TOPDIR)/comp -I$(ALICE_ROOT)/include/ -I$(ALICE_ROOT)/TPC -I$(ALICE_ROOT)/CONTAINERS -I$(ALICE_ROOT)/STEER
-DEFSTR = -Duse_aliroot
+DEFSTR = -Duse_aliroot -Duse_root
 OBJDIR = lib
 endif