Szkoda, że pod postem nie ma przycisku komentuj, wówczas bym go użył.
Cytat: A Ty rozumiesz skąd się biorą problemy wynikające z otrzymywania nieco innych rezultatów w FPU na procesorach AMD i Intel?

Masz wgląd w mikrokod tych procesorów? Myślisz, że mógłbyś taki uzyskać? Nawet jeśli pracujesz dla Intel/AMD i jesteś w stanie to określić, jesteś pewien, że procesor z jeszcze inną jednostką FPU, który zostanie wyprodukowany jutro, też będzie wspierany przez Twój kod?
Nie trzeba pracować w intelu wystarczy zapytać google jak działają liczby zmienno przecinkowe i skąd różnice. Podstawą jest standard IEEE-754, to on opisuje jak zachowują się przechowywane liczby i operacje na nich.
Główny powód różnicy to skończona dokładność zapisu tych liczb. Liczby te zaprojektowano tak aby można było przechowywać duże wartości ( np.:odległość do księżyca) i bardzo małe ( średnica atomu). Gdyby zastosować konwencjonalne sposoby przechowywania liczby takie jak stało przecinkowe to ilość miejsca zajmowanego przez taką liczbę była by głównie marnowana.
A teraz czas na analizę systemu IEEE-754
niech :
float k = 5;
w pamięci pod adresem &k będzie :
0x40A00000
Patrząc na standard dowiadujemy się :
S = Bit 31 znak 0: liczba dodatnia ( zgadza się)
E = Bity 30-23 – wykładnik = 0x81= 129(dec) ; bias dla liczb [0xFE -0x7F ] = 127
M = Bity 22- 0 - mantysa = 0x200000; dodając pierwszy przed przecinkiem ukryty bit (1) i przedstawiając binarnie daje 1,01000000000000000000000 ( BIN) stało przecinkowo
Obliczając wartość tej liczby na dec postępujemy następująco dla pierwszej liczby po przecinku wartość jest
1/(2^1) *0 = 1/2 *0 = 0
1/(2^2) *1 = 1/4 *1 = 0,25
1/(2^3)*0 = 1/8 *0 = 0
(...)
I tak dla ostatniego bitu mamy
1/(2^23) *0 = 1/8388608 * 0 =0 ( to najmniejsza część liczby stało przecinkowej dla mantysy)
Po zsumowaniu wszystkiego daje :
M = 1,25 (dec)stało przecinkowo
Mając już wszystkie składniki liczymy:
S =0
M = 1,25
E = 129
bias = 127
X = (-1)^s * M * 2 ^(E-bias)
X = (-1)^0 * 1,25* (2^(129-127))
X = 1 * 1,25 * 2^(2)
X = 1 *1,25 *4 = 5,0000
Następną liczbą, którą można zapisać będzie z mantysą o jeden większą więc
M =0x200000 +
1 = 0x200001 co w zapisie zmienno przecinkowym bin z początkową jedynką daje
1,0100000000000000000000
1 ( bin)
Przeliczając to na dec mamy (zapisy już tylko dla pozycji na których po przecinku jest 1)
1/(2^2) *1 = 1/4 *1 = 0,25
1/(2^23) *1 = 1/8388608 * 1 = 0,00000011920928955078125 ( tyle obliczył calc)
Co daje w wyniku
M = 1,25000011920928955078125
I dalej obliczając jak wyżej da :
5,000000476837158203125
A tym samym za pomocą zapisu zmienno przecinkowego pojedynczej precyzji nie da się zapisać szeregu liczb z zakresu od
5< X < 5,000000476837158203125
Co więcej drukując liczbę 5,000000476837158203125 z dokładnością do 4 miejsc otrzymamy 5,0000 które nie będzie tym samym 5,0000 z początku postu.
A jeszcze teraz ja mam kilka pytań ;
Cytat:
Do tego implementacja FPU na procesorach AMD, Intel i reszcie może się od siebie nieznacznie różnić
Możesz zapodać jakiś link ? jak nie to może edytuj post bo forum jest od edukacji a nie od dezinformacji. Sądzisz że kupił bym procesor który byłby niekompatybilny ze standardem ?
Eagle