3 // Author: Constantin Loizides <mailto:loizides@fi.uib.no>
4 //*-- Copyright & copy ALICE HLT Group
8 #include "AliL3StandardIncludes.h"
10 #include "AliL3Logging.h"
11 #include "AliL3Logger.h"
13 //calculate statistics according to usage and
14 //difference to floating point results
17 //use cast to int instead of sprintf and atoi
18 //#define FASTWITHROUNDINGERROS
20 #include "AliL3FFloat.h"
22 /** \class AliL3FFloat
24 //----------------------------------------------------
27 // Fixed Floating Point class for debugging purposes.
29 // The class behaves like a normal Double_t class but
30 // calculates everything in respect to fDigits (eg.
31 // fDigits=100 -> 2 digits behind the comma). Further-
32 // more it keeps the exact value in floating precision
33 // and gathers some statistical information about
40 Int_t AliL3FFloat::fDigits = DEFDIG;
41 Int_t AliL3FFloat::fMax = DEFMAX;
42 Int_t AliL3FFloat::fMin = DEFMIN;
45 Int_t AliL3FFloat::fN = 0;
46 Int_t AliL3FFloat::fNRounded = 0;
47 Int_t AliL3FFloat::fNOpAdds = 0;
48 Int_t AliL3FFloat::fNOpMults = 0;
49 Int_t AliL3FFloat::fNOpDivs = 0;
50 Int_t AliL3FFloat::fNOpSubs = 0;
51 Int_t AliL3FFloat::fNOverFlow = 0;
52 Int_t AliL3FFloat::fNUnderFlow = 0;
53 Double_t AliL3FFloat::fNDiff = 0;
56 void AliL3FFloat::PrintStat(){
58 cout << "fN: " << fN << endl;
59 cout << "fNRounded: " << fNRounded << endl;
60 cout << "fNOpAdds: " << fNOpAdds << endl;
61 cout << "fNOpSubs: " << fNOpSubs << endl;
62 cout << "fNOpMults: " << fNOpMults << endl;
63 cout << "fNOpDivs: " << fNOpDivs << endl;
64 cout << "fNOpOverFlow: " << fNOverFlow << endl;
65 cout << "fNOpUnderFlow: " << fNUnderFlow << endl;
66 if(fN) cout << "fNDiff: " << fNDiff/fN << endl;
68 cerr << "Not compiled with #define CALCSTATS!" << endl;
72 AliL3FFloat::~AliL3FFloat()
75 Double_t diff=fabs(fVal-fExactVal);
76 // if(diff>10./fDigits) cout << diff << " Diff " << *this << endl;
81 ostream& operator<<(ostream &os, const AliL3FFloat &f)
83 os << (Double_t)f << "(" << f.fExactVal << ")";
87 AliL3FFloat operator + (const AliL3FFloat &f1,const AliL3FFloat &f2)
94 AliL3FFloat operator + (const AliL3FFloat &f1,const Double_t f2)
101 AliL3FFloat operator + (const Double_t f1,const AliL3FFloat &f2)
108 AliL3FFloat operator + (const AliL3FFloat &f)
114 AliL3FFloat operator - (const AliL3FFloat &f1,const AliL3FFloat &f2)
121 AliL3FFloat operator - (const AliL3FFloat &f1,const Double_t f2)
128 AliL3FFloat operator - (const Double_t f1,const AliL3FFloat &f2)
135 AliL3FFloat operator - (const AliL3FFloat &f)
137 AliL3FFloat r((-(Double_t)f));
141 AliL3FFloat operator * (const AliL3FFloat &f1,const AliL3FFloat &f2)
148 AliL3FFloat operator * (const AliL3FFloat &f1,const Double_t f2)
155 AliL3FFloat operator * (const Double_t f1,const AliL3FFloat &f2)
162 AliL3FFloat operator / (const AliL3FFloat &f1,const AliL3FFloat &f2)
169 AliL3FFloat operator / (const AliL3FFloat &f1,const Double_t f2)
176 AliL3FFloat operator / (const Double_t f1,const AliL3FFloat &f2)
184 void AliL3FFloat::SetParams(Int_t dig,Int_t min,Int_t max)
191 inline void AliL3FFloat::Set(Double_t val)
200 inline void AliL3FFloat::Set(const AliL3FFloat &f)
204 fExactVal=f.GetExactVal();
211 inline void AliL3FFloat::Round(Double_t val)
214 fVali=Fnt_t(val*fDigits);
215 fVal=Double_t(fVali)/fDigits;
217 if(fVal!=fExactVal) fNRounded++;
221 inline Bool_t AliL3FFloat::CheckUpperBound()
225 fVali=Fnt_t(fMax*fDigits);
234 inline Bool_t AliL3FFloat::CheckLowerBound()
238 fVali=Fnt_t(fMin*fDigits);
247 AliL3FFloat& AliL3FFloat::operator += (const AliL3FFloat &f)
249 fExactVal+=f.GetExactVal();
250 fVali+=f.GetValInt();
251 fVal=Double_t(fVali)/fDigits;
259 AliL3FFloat& AliL3FFloat::operator += (const Double_t f)
262 fVali+=Fnt_t(f*fDigits);
263 fVal=Double_t(fVali)/fDigits;
271 AliL3FFloat& AliL3FFloat::operator -= (const AliL3FFloat &f)
273 fExactVal-=f.GetExactVal();
274 fVali-=f.GetValInt();
275 fVal=Double_t(fVali)/fDigits;
283 AliL3FFloat& AliL3FFloat::operator -= (const Double_t f)
286 fVali-=Fnt_t(f*fDigits);
287 fVal=Double_t(fVali)/fDigits;
295 AliL3FFloat& AliL3FFloat::operator *= (const AliL3FFloat &f)
297 fExactVal*=f.GetExactVal();
298 fVali=Fnt_t((fVali*f.GetValInt())/fDigits);
299 fVal=Double_t(fVali)/fDigits;
307 AliL3FFloat& AliL3FFloat::operator *= (const Double_t f)
310 fVali=Fnt_t(fVali*Fnt_t(f));
311 fVal=Double_t(fVali)/fDigits;
319 AliL3FFloat& AliL3FFloat::operator /= (const AliL3FFloat &f)
321 fExactVal/=f.GetExactVal();
322 fVali=Fnt_t(fVali*fDigits/f.GetValInt());
323 fVal=Double_t(fVali)/fDigits;
331 AliL3FFloat& AliL3FFloat::operator /= (const Double_t f)
334 fVali=Fnt_t((fVali*fDigits)/(Int_t(f*fDigits)));
335 fVal=Double_t(fVali)/fDigits;
343 //--------------------------------------------------------
345 //--------------------------------------------------------
347 Char_t AliL3FFloat::fQuery[10] = "%.2f";
349 inline void AliL3FFloat::Set(const Double_t val)
359 inline void AliL3FFloat::Set(const AliL3FFloat &f)
362 fExactVal=f.GetExactVal();
369 AliL3FFloat& AliL3FFloat::operator += (const AliL3FFloat &f)
371 Double_t ev=fExactVal+f.GetExactVal();
372 Set(fVal+(Double_t)f);
380 AliL3FFloat& AliL3FFloat::operator += (const Double_t f)
382 Double_t ev=fExactVal+f;
391 AliL3FFloat& AliL3FFloat::operator -= (const AliL3FFloat &f)
393 Double_t ev=fExactVal-f.GetExactVal();
394 Set(fVal-(Double_t)f);
402 AliL3FFloat& AliL3FFloat::operator -= (const Double_t f)
404 Double_t ev=fExactVal-f;
413 AliL3FFloat& AliL3FFloat::operator *= (const AliL3FFloat &f)
415 Double_t ev=fExactVal*f.GetExactVal();
416 Set(fVal*(Double_t)f);
424 AliL3FFloat& AliL3FFloat::operator *= (const Double_t f)
426 Double_t ev=fExactVal*f;
435 AliL3FFloat& AliL3FFloat::operator /= (const AliL3FFloat &f)
437 Double_t ev=fExactVal/f.GetExactVal();
438 Set(fVal/(Double_t)f);
446 AliL3FFloat& AliL3FFloat::operator /= (const Double_t f)
448 Double_t ev=fExactVal/f;
457 inline Bool_t AliL3FFloat::CheckUpperBound()
469 inline Bool_t AliL3FFloat::CheckLowerBound()
481 #ifdef FASTWITHROUNDINGERROS
482 inline Double_t AliL3FFloat::Round(Double_t val)
484 Int_t dummy=Int_t(fDigits*val);
485 Double_t ret=(Double_t)(dummy)/fDigits;
487 if(ret!=val) fNRounded++;
492 inline Double_t AliL3FFloat::Round(Double_t val)
494 static Char_t strnum[100];
495 sprintf(strnum,fQuery,val);
496 Double_t ret=atof(strnum);
498 if(ret!=val) fNRounded++;
504 void AliL3FFloat::SetParams(Int_t dig,Int_t min,Int_t max)
508 if(fDigits>0) prec=(Int_t)log10(fDigits);
509 sprintf(fQuery,"%%.%df",prec);