diff --git a/hist/hist/src/TH1.cxx b/hist/hist/src/TH1.cxx index 80f3e527e51822cc3669a3c8ff51cda4f0e7cead..3db97cb6f49ec278b4cfe82410a07e258f80546b 100644 --- a/hist/hist/src/TH1.cxx +++ b/hist/hist/src/TH1.cxx @@ -1480,7 +1480,10 @@ bool TH1::CheckBinLimits(const TAxis* a1, const TAxis * a2) } else { for ( int i = 0; i < fN; ++i ) { - if ( ! TMath::AreEqualRel( h1Array->GetAt(i), h2Array->GetAt(i), 1E-10 ) ) { + // for i==fN (nbin+1) a->GetBinWidth() returns last bin width + // we do not need to exclude that case + double binWidth = a1->GetBinWidth(i); + if ( ! TMath::AreEqualAbs( h1Array->GetAt(i), h2Array->GetAt(i), binWidth*1E-10 ) ) { throw DifferentBinLimits(); return false; } @@ -1528,8 +1531,10 @@ bool TH1::CheckBinLabels(const TAxis* a1, const TAxis * a2) bool TH1::CheckAxisLimits(const TAxis *a1, const TAxis *a2 ) { - if ( ! TMath::AreEqualRel(a1->GetXmin(), a2->GetXmin(),1.E-12) || - ! TMath::AreEqualRel(a1->GetXmax(), a2->GetXmax(),1.E-12) ) { + double firstBin = a1->GetBinWidth(1); + double lastBin = a1->GetBinWidth( a1->GetNbins() ); + if ( ! TMath::AreEqualAbs(a1->GetXmin(), a2->GetXmin(), firstBin* 1.E-10) || + ! TMath::AreEqualAbs(a1->GetXmax(), a2->GetXmax(), lastBin*1.E-10) ) { throw DifferentAxisLimits(); return false; } @@ -1598,8 +1603,10 @@ bool TH1::CheckConsistentSubAxes(const TAxis *a1, Int_t firstBin1, Int_t lastBin return false; } - if ( ! TMath::AreEqualRel(xmin1,xmin2,1.E-12) || - ! TMath::AreEqualRel(xmax1,xmax2,1.E-12) ) { + Double_t firstBin = a1->GetBinWidth(firstBin1); + Double_t lastBin = a1->GetBinWidth(lastBin1); + if ( ! TMath::AreEqualAbs(xmin1,xmin2,1.E-10 * firstBin) || + ! TMath::AreEqualAbs(xmax1,xmax2,1.E-10 * lastBin) ) { ::Info("CheckConsistentSubAxes","Axes have different limits"); return false; } @@ -5378,7 +5385,7 @@ static inline bool IsEquidistantBinning(const TAxis& axis) const Double_t firstBinWidth = axis.GetBinWidth(1); for (int i = 1; i < axis.GetNbins(); ++i) { const Double_t binWidth = axis.GetBinWidth(i); - const bool match = TMath::AreEqualRel(firstBinWidth, binWidth, TMath::Limits<Double_t>::Epsilon()); + const bool match = TMath::AreEqualRel(firstBinWidth, binWidth, 1.E-10); isEquidistant &= match; if (!match) break;