Proč je desetinné číslo defaultně double?

Proč je desetinné číslo defaultně double?
« kdy: 02. 03. 2014, 15:52:40 »
Len sa divim. V asi skoro vsetkych jazykoch je obycajne desatinne cislo (literal) typu double. Tzn. ze nemozem napisat toto:

float x = 2.45;

Namiesto toho musim explicitne urcit, ze sa jedna o float:

float x = 2.45f;

Preco je to tak? Som si absolutne isty, ze pre drvivu vacsinu pripadov 32-bitovy float uplne staci. Dostali ste sa uz vobec do situacie, ked vam 32-bitov nestacilo? Ja este nie. Preto by som povazoval za rozumne, aby desatinne cislo bolo defaultne 32-bitovy float. Ved aj literal celeho cisla je defaultne int a nie long. Co si o tom myslite vy?
« Poslední změna: 02. 03. 2014, 16:37:58 od Roman Bořánek »


Jakub Galgonek

Re:Preco je desatinne cislo defaultne double?
« Odpověď #1 kdy: 02. 03. 2014, 16:28:46 »
Preco je to tak? Som si absolutne isty, ze pre drvivu vacsinu pripadov 32-bitovy float uplne staci. Dostali ste sa uz vobec do situacie, ked vam 32-bitov nestacilo? Ja este nie.

O jakém jazyce je řeč? Třeba norma C++ neříká nic o tom, že float je 32 bitový. Vlastně se ten typ ani nemusí držet IEEE 754.

Co se týče praxe, jo setkal jsem se s případy, kdy 32-bitový float nestačil. Ono stačí chvíli v tom floatu něco počítat a za chvíli začnou vycházet blbosti.

Re:Preco je desatinne cislo defaultne double?
« Odpověď #2 kdy: 02. 03. 2014, 16:38:56 »
Co se týče praxe, jo setkal jsem se s případy, kdy 32-bitový float nestačil. Ono stačí chvíli v tom floatu něco počítat a za chvíli začnou vycházet blbosti.

Ono samozrejme sa mozu vyskytnut aj situacie, ked 32-bitov nestaci, ja nehovorim, ze 64-bitovy by nemal existovat. Len to hovorim, ze by nemal byt defaultny, pretoze naozaj, vacsinou staci tych 32-bitov.

vyvojar

Re:Proč je desetinné číslo defaultně double?
« Odpověď #3 kdy: 02. 03. 2014, 16:44:28 »
Právě že bych spíš řekl, že ve většině případů, kde už použiješ ten float, potřebuješ co největší přesnost.

Re:Preco je desatinne cislo defaultne double?
« Odpověď #4 kdy: 02. 03. 2014, 16:47:11 »
Som si absolutne isty, ze pre drvivu vacsinu pripadov 32-bitovy float uplne staci. Dostali ste sa uz vobec do situacie, ked vam 32-bitov nestacilo? Ja este nie.

Ja se naopak nedostal do situace, kdy bych musel setrit pameti na takove urovni, abych musel sahnout k floatu. Kdyz programuju fyzikalni simulace, vzdy prakticky bez premysleni beru double (mensi chyby zaokrouhlovani).

Co se rychlosti tyce je to slozitejsi, zalezi silne na HW... pokud HW umi pocitat doubly a floaty jsou pri vypoctu prevadeny na doubly, tak muze byt double i rychlejsi. Proto dokud me netlaci pamet, tohle vubec neresim.


DK

Re:Proč je desetinné číslo defaultně double?
« Odpověď #5 kdy: 02. 03. 2014, 16:58:51 »
a Jave je treba defaultne celociselny literal typu long

Jakub Galgonek

Re:Preco je desatinne cislo defaultne double?
« Odpověď #6 kdy: 02. 03. 2014, 17:00:03 »
Len to hovorim, ze by nemal byt defaultny, pretoze naozaj, vacsinou staci tych 32-bitov.

Které případy tvoří tu většinu? Když to vezmeš kolem a kolem, tak ve většině případů asi ten float vlastně ani nepotřebuješ - však až do 486 ani x86 procesory FPU neměly.

Jakub Galgonek

Re:Proč je desetinné číslo defaultně double?
« Odpověď #7 kdy: 02. 03. 2014, 17:02:25 »
a Jave je treba defaultne celociselny literal typu long

Není, v Javě je to defaultně také int.

DK

Re:Proč je desetinné číslo defaultně double?
« Odpověď #8 kdy: 02. 03. 2014, 17:05:20 »
a Jave je treba defaultne celociselny literal typu long

Není, v Javě je to defaultně také int.
nojo, fakt, omlouvam se za dezinformaci

Re:Preco je desatinne cislo defaultne double?
« Odpověď #9 kdy: 02. 03. 2014, 18:19:29 »
Ja se naopak nedostal do situace, kdy bych musel setrit pameti na takove urovni, abych musel sahnout k floatu. Kdyz programuju fyzikalni simulace, vzdy prakticky bez premysleni beru double (mensi chyby zaokrouhlovani).

Co sa tyka fyzikalnych simulacii, tak trebars fyzikalna kniznica Box2D pouziva 32-bitovy float (a naozaj explicitne 32-bitovy). A v ziadnom pripade sa neda hovorit, ze by bola nepresna, prave naopak.

JS

Re:Preco je desatinne cislo defaultne double?
« Odpověď #10 kdy: 02. 03. 2014, 18:35:08 »
Co sa tyka fyzikalnych simulacii, tak trebars fyzikalna kniznica Box2D pouziva 32-bitovy float (a naozaj explicitne 32-bitovy). A v ziadnom pripade sa neda hovorit, ze by bola nepresna, prave naopak.

Box2D neni fyzikalni simulace, to je herni engine.. :) Nas na FJFI (numericka matematika) ucili, ze pouzivat obycejny 32-bitovy float je spatny napad.

JSH

Re:Preco je desatinne cislo defaultne double?
« Odpověď #11 kdy: 03. 03. 2014, 10:29:43 »
Co sa tyka fyzikalnych simulacii, tak trebars fyzikalna kniznica Box2D pouziva 32-bitovy float (a naozaj explicitne 32-bitovy). A v ziadnom pripade sa neda hovorit, ze by bola nepresna, prave naopak.
Pro "fyzikální simulaci" krabic na obrazovce je i ten float skoro overkill. Ještě štěstí, že v C++ nemáme half, jinak by ho mohl někdo pro JEHO drtivou většinu případů taky vyžadovat jako default.
Jo a mluvit u simulátoru krabic o přesnosti už zavání špatným vtipem. Pixel sem, pixel tam, ono se to vsákne. Jak se to hýbe trochu rychleji tak stejně nikdo nic nepozná, pokud se tam někde nehromadí energie.

Re:Preco je desatinne cislo defaultne double?
« Odpověď #12 kdy: 03. 03. 2014, 12:19:23 »
Ja se naopak nedostal do situace, kdy bych musel setrit pameti na takove urovni, abych musel sahnout k floatu. Kdyz programuju fyzikalni simulace, vzdy prakticky bez premysleni beru double (mensi chyby zaokrouhlovani).

Co sa tyka fyzikalnych simulacii, tak trebars fyzikalna kniznica Box2D pouziva 32-bitovy float (a naozaj explicitne 32-bitovy). A v ziadnom pripade sa neda hovorit, ze by bola nepresna, prave naopak.

Delal sem transport nabitych castic v urychlovaci (pruchod magnetovymi soustavami). Na vzdalenosti ~240m dosahuji po mnoha operacich pricne presnosti okolo 0.1μm (ktera je dana spise pouzitou simulacni metodou) a pravdepodobne pujde jit jeste niz. Tady by 32bit floaty docela vadily... ::)

Jak jsem psal, dokud neni problem s pameti, nema vetsinou smysl o floatu uvazovat.

Randolf

Re:Proč je desetinné číslo defaultně double?
« Odpověď #13 kdy: 03. 03. 2014, 13:06:27 »
Ja to vidim jednoduse - mit double jako default je bezpecnejsi reseni pro takove to programovani pro sebe.

Dle meho nazoru existuje mnoho programatoru - laiku, kteri do reprezentace promenne bud nevidi, nebo se nad tim proste nezamysli (napriklad uz jen to, ze u floatu je diskretizacni krok nekonstantni, mate spoustu lidi: ma float, podiva se jak presne reprezentuje cislo kolem nuly, rekne si, ze to staci. A chyba lavky!)

Ja vim, ze je to na prvni pohled jasne, ale plynou z toho dalsi komplikace - napriklad nerovnomerne rozlozeni diskretizacniho sumu zpusobi, ze u mnoha statistickych estimatoru, jako je treba (zakladni) kalmanuv filter, nejsou splneny zakladni podminky, nebot sum soustavy se predpoklada "zero-mean gaussian"). Pouzitim double se tyto problemy casto neprojevi (diskretizacni sum je casto zanedbatelny) a tak to proste funguje. Casto se potom pri prakticke implementaci prejde na single a jeje - ono to nefunguje - proc?

Otazka je, co je lepsi - vyresit problem konceptu pri uvodnim navrhu, nebo pri implementaci? Za mne by toto mely resit coding standards daneho tymu. Co Ti brani explicitne deklarovat single nebo double, jeste lepe pak neco jako float32_t a float64_t? Pokud se o to nezajimas, neni lepsi Ti defaultne poskytnout reseni, s nimz prichazi mene problemu?

Kolemjdoucí

Re:Proč je desetinné číslo defaultně double?
« Odpověď #14 kdy: 03. 03. 2014, 16:28:13 »
Preco je to tak? Som si absolutne isty, ze pre drvivu vacsinu pripadov 32-bitovy float uplne staci. Dostali ste sa uz vobec do situacie, ked vam 32-bitov nestacilo? Ja este nie.

Jsem si absolutně jistý že nemáte ani tušení jak reálné čísla v počítačích fungují, stejně tak jako 99 % lidí fušujících do programování, jinak byste moc dobře věděl o tomhle:

int x = 0x1000001;
float y = (float) x;
int z = (int) y;
if (z == x) printf("All OK"); else printf("Catastrophic problem occured");

Když to vezmeš kolem a kolem, tak ve většině případů asi ten float vlastně ani nepotřebuješ - však až do 486 ani x86 procesory FPU neměly.

FPU v procesorech nebyly, ale na motherboardech bývaly patice pro FPU externí a kdo si tedy připlatil měl už v době 8086 tři různé 32,64,80 bitové formáty s hardwarovou podporou.