]> git.uio.no Git - u/mrichter/AliRoot.git/blob - HLT/misc/AliL3FFloat.h
New version of SPD raw-data reconstruction. The format now correponds to the actual...
[u/mrichter/AliRoot.git] / HLT / misc / AliL3FFloat.h
1 // @(#) $Id$
2
3 #ifndef ALIL3FFLOAT_H
4 #define ALIL3FFLOAT_H
5
6 #include "AliL3RootTypes.h"
7
8 #ifndef USEFFLOAT
9 typedef Float_t AliL3FFloat;
10 #else 
11
12 //use Ints times Digits instead of Floats
13 #define USEINTS
14
15 #define DEFDIG 100
16 #define DEFMIN -1000000
17 #define DEFMAX  1000000
18
19 #ifdef USEINTS
20
21 //ROOT does not know about 64 bit integer
22 #ifdef no_root
23 typedef long long int Fnt_t;
24 #else 
25 typedef Int_t Fnt_t;
26 #endif
27
28 class AliL3FFloat {
29  public:
30   AliL3FFloat(const Double_t val=0) {Set(val);}
31   AliL3FFloat(const AliL3FFloat &f) {Set(f);}
32   virtual ~AliL3FFloat();
33
34   AliL3FFloat& operator = (const AliL3FFloat &f)  {Set(f); return *this;}
35   AliL3FFloat& operator = (const Double_t f)      {Set(f); return *this;}
36
37   operator const Double_t () const {return fVal;}
38   operator const Float_t  () const {return (Float_t)fVal;}
39 #ifdef no_root
40   operator const Fnt_t    () const {return (Fnt_t)fVal;}
41 #endif
42   operator const Int_t    () const {return (Int_t)fVal;}  
43
44
45   friend ostream& operator<<(ostream &os, const AliL3FFloat &f);
46
47   friend AliL3FFloat operator + (const AliL3FFloat &f1,const AliL3FFloat &f2);
48   friend AliL3FFloat operator + (const AliL3FFloat &f1,const Double_t f2);
49   friend AliL3FFloat operator + (const Double_t f1,    const AliL3FFloat &f2);
50   friend AliL3FFloat operator + (const AliL3FFloat &f1);
51   friend AliL3FFloat operator - (const AliL3FFloat &f1,const AliL3FFloat &f2);
52   friend AliL3FFloat operator - (const AliL3FFloat &f1,const Double_t f2);
53   friend AliL3FFloat operator - (const Double_t f1,    const AliL3FFloat &f2);
54   friend AliL3FFloat operator - (const AliL3FFloat &f1);
55   friend AliL3FFloat operator * (const AliL3FFloat &f1,const AliL3FFloat &f2);
56   friend AliL3FFloat operator * (const AliL3FFloat &f1,const Double_t f2);
57   friend AliL3FFloat operator * (const Double_t f1,    const AliL3FFloat &f2);
58   friend AliL3FFloat operator / (const AliL3FFloat &f1,const AliL3FFloat &f2);
59   friend AliL3FFloat operator / (const AliL3FFloat &f1,const Double_t f2);
60   friend AliL3FFloat operator / (const Double_t f1,    const AliL3FFloat &f2);
61
62   AliL3FFloat& operator += (const AliL3FFloat &f);
63   AliL3FFloat& operator += (const Double_t f);
64   AliL3FFloat& operator -= (const AliL3FFloat &f);
65   AliL3FFloat& operator -= (const Double_t f);
66   AliL3FFloat& operator *= (const AliL3FFloat &f);
67   AliL3FFloat& operator *= (const Double_t f);
68   AliL3FFloat& operator /= (const AliL3FFloat &f);
69   AliL3FFloat& operator /= (const Double_t f);
70   //==,!=,>=, ...
71   //++,--
72
73   static void PrintStat();
74   static void SetParams(Int_t dig=DEFDIG,Int_t min=DEFMIN,Int_t max=DEFMAX);
75   void Set(const Double_t f=0);
76   void Set(const AliL3FFloat &f);
77   inline Double_t GetVal()      const {return fVal;}
78   inline Double_t GetExactVal() const {return fExactVal;}
79   inline Fnt_t   GetValInt()    const {return fVali;}
80
81  private:
82
83   void   Round(Double_t f);
84   Bool_t CheckUpperBound();
85   Bool_t CheckLowerBound();
86   Bool_t CheckBounds() {return (CheckUpperBound() && CheckLowerBound());}
87
88   Fnt_t   fVali;
89   Double_t fVal;
90   Double_t fExactVal;
91
92   static Int_t fDigits;
93   static Int_t fMax; 
94   static Int_t fMin; 
95
96 #ifdef CALCSTATS
97   static Int_t fN;
98   static Int_t fNRounded;
99   static Int_t fNOpAdds;
100   static Int_t fNOpMults;
101   static Int_t fNOpDivs;
102   static Int_t fNOpSubs;
103   static Int_t fNOverFlow;
104   static Int_t fNUnderFlow;
105   static Double_t fNDiff;
106 #endif
107
108   ClassDef(AliL3FFloat,1)
109 };
110
111 #else
112
113 class AliL3FFloat {
114  public:
115   AliL3FFloat(const Double_t val=0) {Set(val);}
116   AliL3FFloat(const AliL3FFloat &f) {Set(f);}
117   virtual ~AliL3FFloat();
118
119   AliL3FFloat& operator = (const AliL3FFloat &f)  {Set(f); return *this;}
120   AliL3FFloat& operator = (const Double_t f)      {Set(f); return *this;}
121
122   operator const Double_t () const {return fVal;}
123   operator const Float_t  () const {return (Float_t)fVal;}
124   operator const Int_t    () const {return (Int_t)fVal;}
125
126   friend ostream& operator<<(ostream &os, const AliL3FFloat &f);
127
128   friend AliL3FFloat operator + (const AliL3FFloat &f1,const AliL3FFloat &f2);
129   friend AliL3FFloat operator + (const AliL3FFloat &f1,const Double_t f2);
130   friend AliL3FFloat operator + (const Double_t f1,    const AliL3FFloat &f2);
131   friend AliL3FFloat operator + (const AliL3FFloat &f1);
132   friend AliL3FFloat operator - (const AliL3FFloat &f1,const AliL3FFloat &f2);
133   friend AliL3FFloat operator - (const AliL3FFloat &f1,const Double_t f2);
134   friend AliL3FFloat operator - (const Double_t f1,    const AliL3FFloat &f2);
135   friend AliL3FFloat operator - (const AliL3FFloat &f1);
136   friend AliL3FFloat operator * (const AliL3FFloat &f1,const AliL3FFloat &f2);
137   friend AliL3FFloat operator * (const AliL3FFloat &f1,const Double_t f2);
138   friend AliL3FFloat operator * (const Double_t f1,    const AliL3FFloat &f2);
139   friend AliL3FFloat operator / (const AliL3FFloat &f1,const AliL3FFloat &f2);
140   friend AliL3FFloat operator / (const AliL3FFloat &f1,const Double_t f2);
141   friend AliL3FFloat operator / (const Double_t f1,    const AliL3FFloat &f2);
142
143   AliL3FFloat& operator += (const AliL3FFloat &f);
144   AliL3FFloat& operator += (const Double_t f);
145   AliL3FFloat& operator -= (const AliL3FFloat &f);
146   AliL3FFloat& operator -= (const Double_t f);
147   AliL3FFloat& operator *= (const AliL3FFloat &f);
148   AliL3FFloat& operator *= (const Double_t f);
149   AliL3FFloat& operator /= (const AliL3FFloat &f);
150   AliL3FFloat& operator /= (const Double_t f);
151   //==,!=,>=, ...
152   //++,--
153
154   static void PrintStat();
155   static void SetParams(Int_t dig=DEFDIG,Int_t min=DEFMIN,Int_t max=DEFMAX);
156   void Set(const Double_t f=0);
157   void Set(const AliL3FFloat &f);
158   inline Double_t GetVal()      const {return fVal;}
159   inline Double_t GetExactVal() const {return fExactVal;}
160
161  private:
162
163   Double_t Round(Double_t f);
164   Bool_t CheckUpperBound();
165   Bool_t CheckLowerBound();
166   Bool_t CheckBounds() {return (CheckUpperBound() && CheckLowerBound());}
167
168   Double_t fVal;
169   Double_t fExactVal;
170
171   static Int_t fDigits;
172   static Char_t fQuery[10];
173   static Int_t fMax;
174   static Int_t fMin;
175
176 #ifdef CALCSTATS
177   static Int_t fN;
178   static Int_t fNRounded;
179   static Int_t fNOpAdds;
180   static Int_t fNOpMults;
181   static Int_t fNOpDivs;
182   static Int_t fNOpSubs;
183   static Int_t fNOverFlow;
184   static Int_t fNUnderFlow;
185   static Double_t fNDiff;
186 #endif
187
188   ClassDef(AliL3FFloat,1)
189 };
190
191 #endif
192 #endif
193 #endif
194
195
196
197