gpt4 book ai didi

c++ - 浮点异常的原因?

转载 作者:行者123 更新时间:2023-11-28 08:17:40 24 4
gpt4 key购买 nike

这是我在 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

补充:南的很奇怪。它们附近的数字看起来很正常,这不是一个会爆炸的函数,所以我是在使用数组的垃圾值吗?

最佳答案

在遍历所有轨道的第一个循环中,只有轨道电荷为正时才填充阵列。在第二个循环中,无论第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);
}
}

关于c++ - 浮点异常的原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7145925/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com