[JAVA] Wytłumaczenie działania jednej funkcji


(Rxprojekt) #1

Witam. Mam pytanko. Otóż chciałem przerobić ten skrypt z języka JAVA na inny język, a nie rozumiem jednej funkcji.

private int[] rgb2yuv(int r,int g, int b) 

    {

        int[] yuv = new int[3];


        yuv[0] = (int)(0.299 * r + 0.587 * g + 0.114 * b);

        yuv[1] = (int)((b - yuv[0]) * 0.492f); 

        yuv[2] = (int)((r - yuv[0]) * 0.877f);


        return yuv;

    }


    private int[] yuv2rgb(int y, int u, int v)

    {

        int[] rgb = new int[3];


        rgb[0] = (int)(1.164*(y - 16) + 1.596*(v - 128));

        rgb[1] = (int)(1.164*(y - 16) - 0.813*(v - 128) - 0.391*(u - 128)); 

        rgb[2] = (int)(1.164*(y - 16) + 2.018*(u - 128));


        return rgb;

    }

Otóż mój obiekt zainteresowań stanowią linijki :

yuv[1] = (int)((b - yuv[0]) * 0.492f); 

        yuv[2] = (int)((r - yuv[0]) * 0.877f);

O co chodzi z tym 0.492f i 0.877f ? Jakie to są liczby w naszym dziesiętnym systemie ??

Proszę o pomoc. Z góry dziękuję.


(Frankfurterium) #2

Takie, jakie widzisz (poza f).

Kiedy piszesz w Javie liczbę z kropką, domyślnie będzie to double - ułamek zapisany na ośmiu bajtach (chyba do 15 cyfr po przecinku). Kiedy masz masę obliczeń ale nie zależy ci na takiej dokładności, możesz użyć typu f loat - o połowę mniej cyfr po przecinku ale zajmuje w pamięci połowę mniej miejsca. Takie dołączenie do ułamka f mówi kompilatorowi, żeby w obliczeniach traktować ją jako float, a nie double.


(Rxprojekt) #3

Dzięki. Już przekonwertowałem w całości i działa :slight_smile: