0

これは、 C++といくつかの事前定義されたクラスを使用してROOTフレームワークで作成しているマクロの一部です。以下にマークされた行(で始まる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

追加:ナンは非常に奇妙です。近くの数字は正常に見えますが、これは爆発する関数ではないので、配列のジャンク値を使用していますか?

4

1 に答える 1

1

すべてのトラックに対する最初のループでは、トラックの電荷が正の場合にのみ配列を埋めます。2 番目のループでは、k 番目のトラックの電荷が正かどうかに関係なく、配列にアクセスします。

minv正電荷をチェックする最初のループを削除しif、最後のループを次のように変更します。

for (Int_t i=0; i<nTracks; i++) {
    Track* trackData = (Track*)trackArray->At(i);
    for (Int_t k=0; k<nTracks; k++){
        Track* trackData2 = (Track*)trackArray->At(k);
        if (trackData->fCharge == trackData2->fCharge)
            continue;

        // calculate minv here
        invm->Fill(minv);
    }
}
于 2011-09-20T15:46:28.430 に答える