Hi Jeff, Thanks for reporting this interesting rare case. Now protected in the CVS version. Rene Brun On 29 Jul 2003, Jeff Hartnell wrote: > Hi, > I have discovered that TMinuit will cause a Floating Point Exception > (FPE) with a rare combination of numbers. > > I am using root 3.05/05 on SuSE 8.2 Linux but I believe it is a generic > problem. > > In order to see this FPE you have to set the flag (sigfpe?) that causes > a program to crash when it happens (the safest option!). > > Once you have turned on FPE trapping then the macro pasted below will > crash. > > Here is the trace from gdb: > > Program received signal SIGFPE, Arithmetic exception. > [Switching to Thread 16384 (LWP 22186)] > 0x428cdbb4 in TMinuit::mnmigr() () from > /usr/local/root_3_05_05/root/lib/libMinuit.so > (gdb) up > #1 0x428c5c44 in TMinuit::mnexcm(char const*, double*, int, int&) () > from /usr/local/root_3_05_05/root/lib/libMinuit.so > (gdb) up > #2 0x428bc5cf in TFitter::ExecuteCommand(char const*, double*, int) () > from /usr/local/root_3_05_05/root/lib/libMinuit.so > (gdb) > #3 0x41cb8f94 in TGraph::Fit(TF1*, char const*, char const*, double, > double) () > from /usr/local/root_3_05_05/root/lib/libGraf.so > (gdb) > > Hope you can fix it! > > Thanks, > Jeff. > > Here is the macro: > { > > //there are two steps to this > //1.) slightly modify the values used to make fit not fpe > //2.) use the values that cause the fpe > > float oddplanes[30] = {0}; > float oddstrips[30] = {0}; > int oddcnt = 0; > > //set up a particular senario > oddcnt=4; > oddplanes[0]=15; > oddplanes[1]=17; > oddplanes[2]=19; > oddplanes[3]=21; > > oddstrips[0]=1; > oddstrips[1]=3; > oddstrips[2]=6; > oddstrips[3]=9; > > TF1* form=new TF1("form","pol1",0,60); > > for (Int_t i=0;i<oddcnt;i++){ > cout<<"oddcnt="<<oddcnt > <<", plane="<<oddplanes[i] > <<", strip="<<oddstrips[i]<<endl; > > //hack to make it work > oddplanes[i]+=0.00001; > oddstrips[i]+=0.00001; > cout<<"After hack: oddcnt="<<oddcnt > <<", plane="<<oddplanes[i] > <<", strip="<<oddstrips[i]<<endl; > } > TGraph* oddgr=new TGraph(oddcnt,oddplanes,oddstrips); > cout<<"Created graph"<<endl; > oddgr->Fit(form); > cout<<"Fitted graph"<<endl<<endl; > > //set up the particular senario again > oddcnt=4; > oddplanes[0]=15; > oddplanes[1]=17; > oddplanes[2]=19; > oddplanes[3]=21; > > oddstrips[0]=1; > oddstrips[1]=3; > oddstrips[2]=6; > oddstrips[3]=9; > > for (Int_t i=0;i<oddcnt;i++){ > cout<<"oddcnt="<<oddcnt > <<", plane="<<oddplanes[i] > <<", strip="<<oddstrips[i]<<endl; > //oddplanes[i]+=0.0001; > //oddstrips[i]+=0.0001; > cout<<"oddcnt="<<oddcnt > <<", plane="<<oddplanes[i] > <<", strip="<<oddstrips[i]<<endl; > } > > TGraph* oddgr=new TGraph(oddcnt,oddplanes,oddstrips); > cout<<"Created graph"<<endl; > > cout<<"I will FPE here..."<<endl; > > oddgr->Fit(form); > cout<<"Fitted graph"<<endl; > > cout<<"Finished macro"<<endl; > } > >
This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:14 MET