Tutorial illustrating use and precision of the Double32_t data type You should run this tutorial with ACLIC: a dictionary will be automatically created.
The following cases are supported for streaming a Double32_t type depending on the range declaration in the comment field of the data member:
Case | Declaration |
A | Double32_t fNormal; |
B | Double32_t fTemperature; //[0,100] |
C | Double32_t fCharge; //[-1,1,2] |
D | Double32_t fVertex[3]; //[-30,30,10] |
E | Double32_t fChi2; //[0,0,6] |
F | Int_t fNsp;
Double32_t* fPointValue; //[fNsp][0,3] |
- Case A fNormal is converted from a Double_t to a Float_t
- Case B fTemperature is converted to a 32 bit unsigned integer
- Case C fCharge is converted to a 2 bits unsigned integer
- Case D the array elements of fVertex are converted to an unsigned 10 bits integer
- Case E fChi2 is converted to a Float_t with truncated precision at 6 bits
- Case F the fNsp elements of array fPointvalue are converted to an unsigned 32 bit integer. Note that the range specifier must follow the dimension specifier.
Case B has more precision than case A: 9 to 10 significative digits and 6 to 7 digits respectively. The range specifier has the general format: [xmin,xmax] or [xmin,xmax,nbits]. Examples
- [0,1]
- [-10,100];
- [-pi,pi], [-pi/2,pi/4],[-2pi,2*pi]
- [-10,100,16]
- [0,0,8] Note that:
- If nbits is not specified, or nbits <2 or nbits>32 it is set to 32
- If (xmin==0 and xmax==0 and nbits <=14) the double word will be converted to a float and its mantissa truncated to nbits significative bits.
IMPORTANT NOTE
Lets assume an original variable double x. When using the format [0,0,8] (i.e. range not specified) you get the best relative precision when storing and reading back the truncated x, say xt. The variance of (x-xt)/x will be better than when specifying a range for the same number of bits. However the precision relative to the range (x-xt)/(xmax-xmin) will be worse, and vice-versa. The format [0,0,8] is also interesting when the range of x is infinite or unknown.
private:
public:
{
}
};
{
}
auto h =
new TH1F(
"h",
"Double32_t compression and precision",
nb, 0,
nb);
h->GetXaxis()->SetBinLabel(i + 1,
brName);
gcx->SetPoint(i, i + 0.5,
cx);
if (i == 0 ) continue;
hdval->GetXaxis()->SetTitle(
"Difference wrt reference value");
}
h->GetXaxis()->LabelsOption(
"v");
legend->AddEntry(
gcx,
"Compression factor",
"lp");
legend->AddEntry(
gdrange,
"Log of precision wrt range: p = -Log_{10}( RMS( #frac{Ref - x}{range} ) ) ",
"lp");
legend->AddEntry(
gdval,
"Log of precision wrt value: p = -Log_{10}( RMS( #frac{Ref - x}{Ref} ) ) ",
"lp");
}
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t r
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
A TTree is a list of TBranches.
static TFile * Open(const char *name, Option_t *option="", const char *ftitle="", Int_t compress=ROOT::RCompressionSetting::EDefaults::kUseCompiledDefault, Int_t netopt=0)
Create / open a file.
A TGraph is an object made of two arrays X and Y with npoints each.
1-D histogram with a float per channel (see TH1 documentation)
This class displays a legend box (TPaveText) containing several legend entries.
Random number generator class based on M.
A TTree represents a columnar dataset.
tbb::task_arena is an alias of tbb::interface7::task_arena, which doesn't allow to forward declare tb...
Double_t RMS(Long64_t n, const T *a, const Double_t *w=nullptr)
Returns the Standard Deviation of an array a with length n.
Short_t Max(Short_t a, Short_t b)
Returns the largest of a and b.
Double_t Log10(Double_t x)
Returns the common (base-10) logarithm of x.
- Author
- Rene Brun
Definition in file double32.C.