fixed point - rownanie

0

Witam
mam problem z fixed pointami.
Oto fragment kodu

public static void main(String[] args)
	{
		int PRESISION = 10;
		
		int i = 0;
		int[] tabX = {10,10,10,10};
		int t = 1;
		
		int newX = (int) (0.5 * ((2 * tabX[i + 1]) + (-tabX[i] + tabX[i + 2]) * t
				+ (2 * tabX[i] - 5 * tabX[i + 1] + 4 * tabX[i + 2] - tabX[i + 3]) * (t * t) + (-tabX[i] + 3 * tabX[i + 1]
				- 3 * tabX[i + 2] + tabX[i + 3])
				* (t * t * t)));
		
		System.out.println("newX = "+newX);
		
		System.out.println("precision = "+PRESISION);
		for (int j = 0; j < tabX.length; j++) 
		{
			tabX[j] <<= PRESISION;
			System.out.println("tabx = "+tabX[j]);
		}
		t <<= PRESISION;
		System.out.println("t = "+t);
		
		long newY = (long) (512 * ((2048 * tabX[i + 1]) + (-tabX[i] + tabX[i + 2]) * t+ 
				(2048 * tabX[i] - 5120 * tabX[i + 1] + 4096 * tabX[i + 2] - tabX[i + 3]) * (t * t) + 
				(-tabX[i] + 3072 * tabX[i + 1]- 3072 * tabX[i + 2] + tabX[i + 3])* (t * t * t)));
		
		System.out.println("newY = "+(newY)+" "+(newY>>PRESISION)+" "+(newY>>(PRESISION+4))+" "+(newY>>(PRESISION+5))+" "+(-newY>>>(PRESISION+PRESISION)));
		
		// TODO Auto-generated method stub

	}

Chodzi mi o to zeby newY i newX mialy taki sam wynik. newX jest zrobiony na floatach. Natomiast newY w zamysle mial byz zrobiony na fixed pointach. Wyniki sa calkowicie rozbiezne - czy ma ktos pomysl jak to ugryzc?
pozdrawiam

0

public static void main(String[] args)
{
int PRESISION = 15;

        int i = 0;
        long[] tabX = {5,7,15,8};
        long t = 3;
       
        long newX = (long) (0.5 * ((2 * tabX[i + 1]) + (-tabX[i] + tabX[i + 2]) * t
                        + (2 * tabX[i] - 5 * tabX[i + 1] + 4 * tabX[i + 2] - tabX[i + 3]) * (t * t) + (-tabX[i] + 3 * tabX[i + 1]
                        - 3 * tabX[i + 2] + tabX[i + 3])
                        * (t * t * t)));
       
        System.out.println("newX = "+newX);
       
        System.out.println("precision = "+PRESISION);
        for (int j = 0; j < tabX.length; j++)
        {
                tabX[j] <<= PRESISION;
                System.out.println("tabx = "+tabX[j]);
        }
        t <<= PRESISION;
        System.out.println("t = "+t);

     //   (a*b>>PRESISION)

        long val_0_5 = (long)(0.5 *(1<<PRESISION));
        
   //   (a*b>>PRESISION)
    long newY=  ( (val_0_5)*( 
    		
   		 ((2<<PRESISION)*tabX[i + 1]>>PRESISION)
   		+   ((-tabX[i] + tabX[i + 2])*t>>PRESISION)
   		+((    ((2<<PRESISION)*tabX[i]>>PRESISION)   - ((5<<PRESISION)*tabX[i + 1]>>PRESISION)   +  ((4<<PRESISION)*tabX[i + 2]>>PRESISION)   - tabX[i + 3])*(t*t>>PRESISION) >>PRESISION)
           + ((-tabX[i] + ((3<<PRESISION)*tabX[i + 1]>>PRESISION)    - ((3<<PRESISION)*tabX[i + 2]>>PRESISION)  + tabX[i + 3])*(t*t*t>>2*PRESISION) >>PRESISION)

   )>>PRESISION); 
    

        System.out.println("newY = "+(newY)+" WYNIK: "+(newY>>PRESISION)+" "+(newY>>(PRESISION+4))+" "+(newY>>(PRESISION+5))+" "+(-newY>>>(PRESISION+PRESISION)));
       
        // TODO Auto-generated method stub


}

WAŻNE wszedzie typu long żeby nie było wewnętrznej konwersji na inty bo zakresy będa się szybko kończyć

0

marci - temat do zamkniecia

1 użytkowników online, w tym zalogowanych: 0, gości: 1