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.
Na webových stránkách komunitního setkání československých správců sítí CSNOG (Czech and Slovak Network Operators Group) najdou nyní zájemci…
Google pracuje na velkém redesignu některých svých produktů, včetně prohlížeče Chrome. První změny už začaly pronikat do vývojové verze…
Dne 24. dubna 2018 zemřel Rick Dickinson – jeden z autorů legendárního počítače ZX Spectrum, který vytvořil i návrhy původních ZX80 a ZX81…
Informace nejen ze světa Linuxu. ISSN 1212-8309
Copyright © 1998 – 2018 Internet Info, s.r.o. Všechna práva vyhrazena. Powered by Linux.
Při poskytování služeb nám pomáhají cookies. Používáním webu s tím vyjadřujete souhlas.