TGraph->Eval() returns the wrong values

I’m getting some strange behaviour with TGraph->Eval() where the function does not appear to be interpolating properly. Code showing the problem is as follows:

{
  Float_t dp[12];
  Float_t val[12];

  val[0] = 2.33 * 199 * 1.078e10;
  val[1] = 2.61 * 201 * 1.022e10;
  val[2] = 2.61 * 189 * 1.060e10;
  val[3] = 2.34 * 235 * 8.965e9;
  val[4] = 2.21 * 332 * 8.941e9;
  val[5] = 2.68 * 186 * 8.987e9;
  val[6] = 2.00 * 516 * 9.320e9;
  val[7] = 2.13 * 593 * 9.545e9;
  val[8] = 2.10 * 677 * 9.984e9;
  val[9] = 2.15 * 560 * 8.959e9;
  val[10] = 2.15 * 650 * 1.021e10;
  val[11] = 1.93 * 799 * 1.073e10;

  dp[0] = 18.1;
  dp[1] = 15.97;
  dp[2] = 13.15;
  dp[3] = 10.70;
  dp[4] = 8.36;
  dp[5] = 6.08;
  dp[6] = 3.59;
  dp[7] = 1.71;
  dp[8] = -0.35;
  dp[9] = -2.20;
  dp[10] = -4.14;
  dp[11] = -5.81;

  Float_t biggest = val[0];

  for( Int_t i = 0; i < 11; i++ )
    {
      if (val[i+1] > val[i] ) biggest = val[i+1];
    }

  for( Int_t j = 0; j < 12; j++)
    {
      val[j] = val[j] / biggest;
    }

  TGraph *gr = new TGraph(12,dp,val);


  Double_t ev;

  for ( Int_t k = -5; k < 18; k++)
    {
      ev = gr->Eval(k,0,"S");
      
      cout << k << "  " << ev << endl; 
   
    }

  gr->SetMarkerStyle(22);
  gr->Draw("APC");

}

The results I get when running the code or ROOT 4.00/08 are

-5  -7.04742
-4  -6.0668
-3  -5.17638
-2  -4.37185
-1  -3.64891
0  -3.00327
1  -2.43063
2  -1.92667
3  -1.48712
4  -1.10765
5  -0.783984
6  -0.51181
7  -0.28683
8  -0.104744
9  0.0387482
10  0.147946
11  0.227149
12  0.280659
13  0.312775
14  0.327796
15  0.330024
16  0.323758
17  0.313299

Any ideas why it is doing this?

Thanks

Ewan

I think Eval assumes that the X values are in increasing order. Try:

{
   Double_t dp[12];
   Double_t val[12];
                                                                                
   val[11]  = 2.33 * 199 * 1.078e10;
   val[10]  = 2.61 * 201 * 1.022e10;
   val[ 9]  = 2.61 * 189 * 1.060e10;
   val[ 8]  = 2.34 * 235 * 8.965e9;
   val[ 7]  = 2.21 * 332 * 8.941e9;
   val[ 6]  = 2.68 * 186 * 8.987e9;
   val[ 5]  = 2.00 * 516 * 9.320e9;
   val[ 4]  = 2.13 * 593 * 9.545e9;
   val[ 3]  = 2.10 * 677 * 9.984e9;
   val[ 2]  = 2.15 * 560 * 8.959e9;
   val[ 1] = 2.15 * 650 * 1.021e10;
   val[ 0] = 1.93 * 799 * 1.073e10;
                                                                                
   dp[11]  = 18.1;
   dp[10]  = 15.97;
   dp[ 9]  = 13.15;
   dp[ 8]  = 10.70;
   dp[ 7]  = 8.36;
   dp[ 6]  = 6.08;
   dp[ 5]  = 3.59;
   dp[ 4]  = 1.71;
   dp[ 3]  = -0.35;
   dp[ 2]  = -2.20;
   dp[ 1] = -4.14;
   dp[ 0] = -5.81;
                                                                                
   Double_t biggest = val[0];
                                                                                
   for( Int_t i = 0; i < 11; i++ ) {
      if (val[i+1] > val[i] ) biggest = val[i+1];
   }
                                                                                
   for( Int_t j = 0; j < 12; j++) {
      val[j] = val[j] / biggest;
   }
                                                                                
   TGraph *gr = new TGraph(12,dp,val);
                                                                                
   Double_t ev,x;
                                                                                
   for ( Int_t k = -5; k < 18; k++) {
      x = (Double_t)k;
      ev = gr->Eval(x);
      printf("ev[%d] = %g\n", k, ev);
   }
                                                                                
   gr->SetMarkerStyle(22);
   gr->Draw("APL");
}