2013-06-06 4 views
0

바이 큐빅 보간법을위한 꽤 표준적인 프로그램을 작성하고 있습니다. 어떤 이유로 Xincrement와 Yincrement를 너무 작게 만들면 for 루프가 너무 빨리 종료되기 시작합니다. 왜 이런 일이 일어나는지 확신 할 수 없습니다. 내 Yincrement 및 Xincrement를 주에 설정하고 .25 이상인 경우 제대로 작동하지만 .2 이하로 줄이면 일찍 한 루프가 중지됩니다. 또한 마지막 3 for-loops는 엉망진창입니다.자바에서의 바이 큐빅 보간

여기 내 코드입니다 :

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; 
} 

너희들이

+1

스택 오버플로에 오신 것을 환영합니다! 코드에서 오류를 발견하도록 사람들에게 요청하는 것은 특히 생산적이지 않습니다. 디버거를 사용하거나 인쇄 문을 추가하여 프로그램의 진행 상황을 추적하고 발생할 것으로 예상되는 것과 비교하여 문제를 격리해야합니다. 이 둘이 갈라지면 문제를 발견했습니다. (그리고 필요하다면 [최소한의 테스트 케이스] (http://sscce.org)를 만들어야한다.) –

답변

1

홈페이지 조언을 일어나는 이유 어떤 생각이 있으면 알려주세요 : double로 반복하지 않습니다. 반복적으로 그것에 추가함으로써 당신은 오류를 누적하고 어떤 경우에는 fencepost 문제로 고통받습니다.

대신 int으로 반복하고 적절한 수식을 사용하여 단일 계산 단계에서 이중 값을 유도하십시오. 이것은 단순히 정수의 적절한 스케일링을 포함 할 것입니다.

0

이와 같은 코드를 반복 할 때는 실제로는 ints을 사용하여 루프를 수행해야합니다. 기입은 정확하고 대략적으로 표시되지 않습니다.

두 배로 반복하면 반올림 오류가 발생하거나 두배를 나타내는 대략적인 특성으로 인해 부정확성이 생길 수 있습니다. 이 오류는 변수를 계속 수정할 때 더 커집니다.

0

부동 소수점 오류처럼 보입니다. R은 유형이 int이고 i, k가 double 유형이므로 이론적으로는 동일하지만 부동 소수점 정밀도로 인해 비교할 수없는 비교 일 수 있습니다.

관련 문제