Takový typický příklad, kde floating point aritmetika selhává, resp. kde se rozchází s myšlením programátora.
Kolik desetníků musíme položit na stůl, abychom získali jednu korunu? Odpověď nám dá (???) následující program:
#include <stdlib.h> #include <stdio.h> int main(void) { double x=0.0; int desetniku=0; while (x<1.0) { x+=0.1; desetniku++; printf("%d %f\n", desetniku, x); } return 0;
Ještě jedna poznámka: pro dvoukorunu (jako výslednou sumu) to funguje, stejně jako tak pro dvacetníky... a teď tuto jasnou chybu v návrhu hledejte v stotisíciřádkovém programu (on totiž v tuto chvíli printf() trošku podvádí).
1 2 3 = 3*1 + 2*10 + 1*100 = 3*(10^0) + 2*(10^1)+ 1*(10^2) stovky desitky jednotkyKdyz si uvedomis, ze takhle se vlastne zapisuje cislo, pro vsechny soustavy uz je to pak stejne. Napr. pro dvojkovou soustavu
0 1 0 1 osmicky ctyrky dvojky jednotky 0101 = 1*2^0 + 0*2^1 + 1*2^2 + 0*2^3 = 1*1 + 0*2 + 1*4 + 0*8 = 5Pro sestnactkovou soustavu
2 9 A(=10) dvestepadesatsestky sestnactky jednotky 29A = 10*16^0 + 9*16^1 + 2*16^2 = 10*1 + 9*16 + 2*256 = 666atd pro dalsi soustavy. Doufam ze je to srozumitelne.
Dobrý den,
myslíte "klasický" převod řetězce dvojkových číslic na desítkovou hodnotu?
Dělá se to následovně: řetězec dvojkových číslic se zapíše do tabulky, kde jsou ke každé pozici bitu vypsány i jejich váhy (desítkově). Potom se sečtou pouze ty váhy, u kterých je příslušný bit nastavený na jedničku, takže například pro řetězec 101010 bysme napsali:
bit váha vypočtená váha váha*bit 1 2^5 32 32 0 2^4 16 0 1 2^3 8 8 0 2^2 4 0 1 2^1 2 2 0 2^0 1 0 Celkem: ***42***
(btw, velmi důležitá kosmologická konstanta :-)
To stejné platí pro fixed point, pouze se změní váhy. Pro číslo 101.101 to bude:
bit váha vypočtená váha váha*bit 1 2^2 4 4,000 0 2^1 2 0,000 1 2^0 1 1,000 1 2^-1 0,5 0,500 0 2^-2 0,25 0,000 1 2^-3 0,125 0,125 Celkem: 5,625
Zdravím, myslím, že se definice blíží bit exact normě. Je definované i přesně, kdy má být vyhlášena výjimka a jak musí být výsledek zaokrouhlován. Norma je však dost složitá a obsahuje několik vyžadovaných režimů nastavení hlášení výjimek a zarovnávání. Myslím, že v podstatě žádný CPU ji do posledního puntíku neplní. Proto musí být pro zajištění plné kompatability doplněn kompilátor a CPU knihovnou. Protože dodržování všech pravidel zpomaluje, umožňuje většinou kompilátor testy a řešení krajních mezí explicitně vynechat, viz parametr GCC "-ffast-math".
Pro otestování splnění bitexact požadavků je často používán "paranoia" test, třeba viz:
Kahan's Floating Point Test "Paranoia"
Výsledek na Linuxu mi vyšel: The arithmetic diagnosed may be Acceptable despite inconvenient Defects.
Předpokládám, že autor článku má v oblasti širší znalosti a proto se těším na další pokračování, které přinese jeho pohled na problémy a zkušenosti s FP.