Krótka odpowiedź
Nie, nie gwarantuje się, że dekodowanie będzie zawsze takie samo. Jednak różnice na pewno będą bardzo, bardzo małe.
Specyfikacje ISO
Specyfikacje Międzynarodowej Organizacji Normalizacyjnej (ISO) dla formatu JPEG mają następujące specyfikacje dla dekoderów (wyróżnienie moje):
Dekoder powinien
a) z odpowiednią dokładnością przekonwertować na zrekonstruowane dane obrazu wszelkie skompresowane dane obrazu z parametrami mieszczącymi się w zakresie obsługiwanym przez aplikację i które są zgodne ze składnią formatu wymiany określoną w załączniku B dla procesu (-ów) dekodowania realizowanego przez dekoder;
b) akceptować i prawidłowo przechowywać dowolną tabelę dane specyfikacji, które są zgodne ze skróconym formatem składni danych specyfikacji tabeli określonym w załączniku B dla procesu (-ów) dekodowania realizowanego przez dekoder;
c) z odpowiednią dokładnością , przekonwertować do zrekonstruowanych danych obrazu wszelkie skompresowane dane obrazu, które są zgodne ze skróconym formatem dla określonej składni skompresowanych danych obrazu w załączniku B dla procesu (-ów) dekodowania realizowanego przez dekoder, pod warunkiem, że dane specyfikacji tabeli wymagane do dekodowania skompresowanych danych obrazu zostały wcześniej zainstalowane w dekoderze.
Odpowiednia dokładność jest bardzo surowa. Każdy konwerter spełniający te specyfikacje należy porównać z algorytmem odniesienia. W przypadku pojedynczego piksela każdy składnik może różnić się od odniesienia tylko o jeden bit. Ponadto (kwadratowy) błąd na każdym bloku 8x8 pikseli i na całym obrazie musi być bardzo mały.
Ale dlaczego miałoby być inaczej?
W przeciwieństwie do bmp czy png, plik jpeg nie przechowuje samych pikseli, ale opis obrazu. Aby zrekonstruować poszczególne piksele, stosuje się złożony algorytm matematyczny. Po każdym kroku algorytm zapisuje wynik w pamięci. W tym miejscu coś może pójść nie tak: wartość w pamięci ma określoną precyzję, precyzję maszyny. Z tego powodu wartość musi zostać zaokrąglona. Chociaż specyfikacje zapewniają minimalną precyzję, nie ma maksymalnej. Zaokrąglenie może więc być różne dla każdej implementacji. Może nawet zależeć od używanego sprzętu, ponieważ niektóre procesory używają więcej bitów precyzji, niż jest to wymagane. Niektóre wczesne procesory Pentium zrobiły to nawet po prostu źle.
Drobny, nadmiernie uproszczony przykład: obliczanie 5 * 0,12 przez wielokrotne dodawanie.
Komputer może to zrobić, przechowując wartości pośrednie z dokładnością do jednej cyfry. : 0,12 + 0,12 = 0,24, zapisz wynik pośredni jako 0,2 (zaokrąglając w dół). Następnie oblicz 0,2 + 0,12 = 0,32, zapisz jako 0,3 (ponownie zaokrąglając w dół). Kontynuuj ten wzór, a wynik wyniesie 0,5 zamiast oczekiwanego wyniku 0,6. Gdyby zastosowano większą dokładność (na przykład dwie cyfry), wynik byłby inny.