0

バイキュービック補間のためのかなり標準的なプログラムを書いています。何らかの理由で、Xincrement と Yincrement を小さくしすぎると、for ループがすぐに終了し始めます。なぜこれが起こっているのか分かりません。Yincrement と Xincrement をメインに設定し、それらが .25 以上であれば問題なく動作しますが、.2 以下に減らすと 1 ループ早く停止します。また、最後の 3 つの for ループはめちゃくちゃです。

これが私のコードです:

public static double ApplyKernel(double [] Row, double Location, int R) {
  double s1; double s2; double s3; double s4;
  double Kernel;
  double s = Location%1;
  s1 = -.5*Math.pow(s+1,3)+2.5*Math.pow(s+1,2)-4*(s+1)+2;
  s2 = 1.5*Math.pow(s,3)-2.5*Math.pow(s,2)+1;
  s3 = 1.5*Math.pow(1-s,3)-2.5*Math.pow(1-s,2)+1;
  s4 = -.5*Math.pow(2-s,3)+2.5*Math.pow(2-s,2)-4*(2-s)+2;
  if(s==0) {
    Kernel = Row[(int)(Location)];
      } else {
    Kernel = s1*Row[(int)(Location-1)]+s2*Row[(int)Location]+s3*Row[(int)   (Location+1)]+s4*Row[(int)(Location+2)];
  }  
return Kernel;      
}

public static double[][] zValues(double [][] ExtendP,  int R, double X, double Y, double    Xincrement, double Yincrement) throws FileNotFoundException
{
  String phFileName = "Data37.txt";
  PrintStream phOutput = new PrintStream( phFileName );

  double[][] zValues = new double[(int)(R/Xincrement)+1][(int)(R/Yincrement)+1];
  double[] row = new double[R+3];
  for (double i = 1; i<=(R+1); i += Xincrement) {
    phOutput.println(";");
    for (int j = 0; j<R+3; j++) {
      row[j] = ApplyKernel(ExtendP[j], i, R);
    }
    for(double k = 1; k<=(R+1); k += Yincrement) {
        zValues[(int)((i-1)/Xincrement)][(int)((k-1)/Yincrement)] = ApplyKernel(row, k, R);
        phOutput.printf("(%.2f,%.2f) = %.3f ", k, i, ApplyKernel(row, k, R));  
      }
    }


  return zValues;
}

どうしてこうなったのかわかる方いたら教えてください

4

3 に答える 3

1

主なアドバイス: a で反復しないでくださいdouble。繰り返し追加すると、エラーが蓄積され、場合によってはフェンスポストの問題に悩まされます。

代わりに を反復処理しint、適切な式を使用して、単一の計算ステップで double 値を導き出します。これには、整数の適切なスケーリングが含まれます。

于 2013-06-06T20:02:15.290 に答える
0

このようなコードをループするときは、実際intsにループを実行するために使用する必要があります。Int は正確であり、概算されません。

Double を使用してループすると、丸め誤差や、double を表すおおよその性質による不正確さが発生します。変数を変更し続けると、この誤差は大きくなります。

于 2013-06-06T20:02:38.520 に答える
0

浮動小数点エラーのようです。Ris 型で i,k は double 型であるためint、理論的には等しい比較が存在する可能性がありますが、浮動小数点の精度が原因でそう評価されない場合があります。

于 2013-06-06T20:03:29.693 に答える