Это часть макроса, который я пишу в ROOT фреймворке с использованием C ++ и некоторых предопределенных классов.Я получаю исключение с плавающей запятой при включении строк, отмеченных ниже (начиная с minv = ...
).В чем причина этой ошибки?
Double_t ppx[3000],ppy[3000],ppz[3000],pE[3000];
Double_t m = 0.000511;
Double_t minv,epx,epy,epz,eE;
for(Int_t n = 0; n < nEvents; n++) {
inTree->GetEntry(n);
Int_t nTracks = trackArray->GetEntries();
htrack->Fill(nTracks);
for(Int_t i = 0; i < nTracks; i++) {
Track* trackData = (Track*)trackArray->At(i);
if(trackData->fCharge ==1)
{
ppx[i] = (trackData->fPt) * TMath::Cos(trackData->fPhi);
ppy[i] = (trackData->fPt) * TMath::Sin(trackData->fPhi);
ppz[i] = (trackData->fPt) * sinh(trackData->fEta);
pE[i] = m * m - ppx[i] * ppx[i] - ppy[i] * ppy[i] - ppz[i] * ppz[i];
}
hPt->Fill(trackData->fPt);
}
for(Int_t i = 0; i < nTracks; i++) {
Track* trackData = (Track*)trackArray->At(i);
if(trackData->fCharge == -1)
for (Int_t k=0;k<nTracks;k++){
epx = (trackData->fPt) * TMath::Cos(trackData->fPhi);
epy = (trackData->fPt) * TMath::Sin(trackData->fPhi);
epz = (trackData->fPt) * sinh(trackData->fEta);
eE = m*m - epx *epx - epy * epy - epz * epz;
// the following two lines cause the exception:
minv = ((eE +pE[k]) * (eE + pE[k])) - ((epx + ppx[k]) * (epx + ppx[k])) - ((epy + ppy[k]) * (epy + ppy[k])) - ((epz + ppz[k]) * (epz + ppz[k]) );
invm->Fill(minv);
}
}
}
nEventsProcessed++;
}
PS: я знаю, что это не очень эффективное кодирование, я новичок.
Я распечатал значения minv.Вот небольшая выборка, указывающая на вывод
-0.225634
-0.657662
-0.225634
1.53201
-0.225634
nan
-0.630927
-0.225634
-0.225634
-0.225634
-0.225634
-0.228794
-0.225634
-0.7196
-0.225634
-0.225634
-0.520265
-0.228796
0.608326
-0.225634
-0.225634
-0.225634
-0.733564
2.74301
-0.763932
-0.225634
-0.225634
nan
-0.228643
-0.225634
-0.225634
-0.225634
-0.584549
Дополнение: Наны очень странные.Числа в их окрестностях выглядят нормально, и это не взрывная функция, так что я использую в ненужные значения массива?