3 // Author: Constantin Loizides <mailto:loizides@fi.uib.no>
4 //*-- Copyright & copy CL
11 #include "AliL3Logging.h"
12 #include "AliL3Logger.h"
13 #include "AliL3FFloat.h"
15 /** \class AliL3FFloat
17 //----------------------------------------------------
20 // Fixed Floating Point class for debugging purposes.
22 // The class behaves like a normal Double_t class but
23 // calculates everything in respect to fDigits (eg.
24 // fDigits=100 -> 2 digits behind the comma). Further-
25 // more it keeps the exact value in floating precision
26 // and gathers some statistical information about
33 Int_t AliL3FFloat::fDigits = DEFDIG;
34 Int_t AliL3FFloat::fMax = DEFMAX;
35 Int_t AliL3FFloat::fMin = DEFMIN;
36 Char_t AliL3FFloat::fQuery[10] = "%.2f";
39 Int_t AliL3FFloat::fN = 0;
40 Int_t AliL3FFloat::fNRounded = 0;
41 Int_t AliL3FFloat::fNOpAdds = 0;
42 Int_t AliL3FFloat::fNOpMults = 0;
43 Int_t AliL3FFloat::fNOpDivs = 0;
44 Int_t AliL3FFloat::fNOpSubs = 0;
45 Int_t AliL3FFloat::fNOverFlow = 0;
46 Int_t AliL3FFloat::fNUnderFlow = 0;
47 Double_t AliL3FFloat::fNDiff = 0;
51 AliL3FFloat::~AliL3FFloat()
54 fNDiff+=fabs(fVal-fExactVal);
58 ostream& operator<<(ostream &os, const AliL3FFloat &f)
60 // os << (Double_t)f << endl;
61 os << (Double_t)f << "(" << f.fExactVal << ")";
65 AliL3FFloat operator + (const AliL3FFloat &f1,const AliL3FFloat &f2)
72 AliL3FFloat operator + (const AliL3FFloat &f1,const Double_t f2)
79 AliL3FFloat operator + (const Double_t f1,const AliL3FFloat &f2)
86 AliL3FFloat operator + (const AliL3FFloat &f)
93 AliL3FFloat operator - (const AliL3FFloat &f1,const AliL3FFloat &f2)
100 AliL3FFloat operator - (const AliL3FFloat &f1,const Double_t f2)
107 AliL3FFloat operator - (const Double_t f1,const AliL3FFloat &f2)
114 AliL3FFloat operator - (const AliL3FFloat &f)
116 AliL3FFloat r((-(Double_t)f));
120 AliL3FFloat operator * (const AliL3FFloat &f1,const AliL3FFloat &f2)
127 AliL3FFloat operator * (const AliL3FFloat &f1,const Double_t f2)
134 AliL3FFloat operator * (const Double_t f1,const AliL3FFloat &f2)
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& AliL3FFloat::operator += (const AliL3FFloat &f)
164 Double_t ev=fExactVal+f.GetExactVal();
165 Set(fVal+(Double_t)f);
173 AliL3FFloat& AliL3FFloat::operator += (const Double_t f)
175 Double_t ev=fExactVal+f;
184 AliL3FFloat& AliL3FFloat::operator -= (const AliL3FFloat &f)
186 Double_t ev=fExactVal-f.GetExactVal();
187 Set(fVal-(Double_t)f);
195 AliL3FFloat& AliL3FFloat::operator -= (const Double_t f)
197 Double_t ev=fExactVal-f;
206 AliL3FFloat& AliL3FFloat::operator *= (const AliL3FFloat &f)
208 Double_t ev=fExactVal*f.GetExactVal();
209 Set(fVal*(Double_t)f);
217 AliL3FFloat& AliL3FFloat::operator *= (const Double_t f)
219 Double_t ev=fExactVal*f;
228 AliL3FFloat& AliL3FFloat::operator /= (const AliL3FFloat &f)
230 Double_t ev=fExactVal/f.GetExactVal();
231 Set(fVal/(Double_t)f);
239 AliL3FFloat& AliL3FFloat::operator /= (const Double_t f)
241 Double_t ev=fExactVal/f;
250 inline void AliL3FFloat::Set(Double_t val)
260 inline void AliL3FFloat::Set(AliL3FFloat &f)
263 fExactVal=f.GetExactVal();
270 #ifdef FASTWITHROUNDINDERROS
271 inline Double_t AliL3FFloat::Round(Double_t val)
273 Int_t dummy=Int_t(fDigits*val);
274 Double_t ret=(Double_t)(dummy)/fDigits;
276 if(ret!=val) fNRounded++;
281 inline Double_t AliL3FFloat::Round(Double_t val)
283 static Char_t strnum[100];
284 sprintf(strnum,fQuery,val);
285 Double_t ret=atof(strnum);
287 if(ret!=val) fNRounded++;
293 inline Bool_t AliL3FFloat::CheckUpperBound()
306 inline Bool_t AliL3FFloat::CheckLowerBound()
319 void AliL3FFloat::SetParams(Int_t dig,Int_t min,Int_t max)
323 if(fDigits>0) prec=(Int_t)log10(fDigits);
324 sprintf(fQuery,"%%.%df",prec);
329 void AliL3FFloat::PrintStat(){
331 cout << "fN: " << fN << endl;
332 cout << "fNRounded: " << fNRounded << endl;
333 cout << "fNOpAdds: " << fNOpAdds << endl;
334 cout << "fNOpSubs: " << fNOpSubs << endl;
335 cout << "fNOpMults: " << fNOpMults << endl;
336 cout << "fNOpDivs: " << fNOpDivs << endl;
337 cout << "fNOpOverFlow: " << fNOverFlow << endl;
338 cout << "fNOpUnderFlow: " << fNUnderFlow << endl;
339 if(fN) cout << "fNDiff: " << fNDiff/fN << endl;
341 cerr << "Not compiled with #define CALCSTATS!" << endl;