IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Proč používat omezený int, když máme neomezený BigInteger

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
nickname01
Člen
Avatar
nickname01:26.3.2018 18:23

V čem je tedy int lepší?

 
Odpovědět
26.3.2018 18:23
Avatar
Odpovídá na nickname01
Marian Benčat:26.3.2018 18:41

Výkon a atomicita.

Nahoru Odpovědět
26.3.2018 18:41
Totalitní admini..
Avatar
nickname01
Člen
Avatar
Odpovídá na Marian Benčat
nickname01:26.3.2018 19:08

Co je atomicita?

 
Nahoru Odpovědět
26.3.2018 19:08
Avatar
Roman
Člen
Avatar
Odpovídá na nickname01
Roman:26.3.2018 19:54

Nedělitelnost. Jde o to že int je 32bitu tedy 4-bytovy. 32 nebo 64bit OS tak provedou rychlí výpočet bez dalších operací. BigInt je kolos a pro práci sním se musí alokovat paměťový prostor a výpočet už není přímočarý. Zabere více času procesoru a prostoru v paměti.

 
Nahoru Odpovědět
26.3.2018 19:54
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na nickname01
Martin Dráb:26.3.2018 20:02

Co je atomicita?

Tady to znamená, že když v jednom vláknu provádíš třeba sčítání dvou intů a v druhém ten, kam ukládáš výsledek, čteš, nikdy se ti nestane, že bys viděl třeba půlku bitů sečtenou a půlku ještě ne. Ta operaci prostě nelze rozdělit na posloupnost menších operací, které by mohl někdo pozorovat.

Tyhle atomické operace se provádí jednou instrukcí, u BigIntu a jemu podobných nic takového neexistuje – dva BigInty se sčítání postupně, takže opravdu můžeš vidět půlku bitů sečtenou a půlku ještě ne.

Nahoru Odpovědět
26.3.2018 20:02
2 + 2 = 5 for extremely large values of 2
Avatar
Odpovídá na Martin Dráb
Marian Benčat:26.3.2018 20:59

Lépe bych to nevysvětlil.

Nahoru Odpovědět
26.3.2018 20:59
Totalitní admini..
Avatar
nickname01
Člen
Avatar
nickname01:27.3.2018 14:05

A to je ten rozdíl ve výkonu tak strašně zásadní, že se int/long používá i když se neomezený prostor hodí, nebo má int ještě nějakou výhodu?

 
Nahoru Odpovědět
27.3.2018 14:05
Avatar
Pjanus
Člen
Avatar
Odpovídá na nickname01
Pjanus:27.3.2018 14:22

No za A ano rozdíl je docela velký a za B, a to je důležitější, jak často potřebuješ v běžné aplikaci číslo větší než 2,147,483,647?

 
Nahoru Odpovědět
27.3.2018 14:22
Avatar
nickname01
Člen
Avatar
Odpovídá na Pjanus
nickname01:27.3.2018 14:40

>A Jak moc velký?
>B Myslím že třeba kalkulačka nebo jakákoli početní aplikace - kdybych byl uživatel, docela by mě mrzelo kdybych nemohl počítat s velkými čísly

 
Nahoru Odpovědět
27.3.2018 14:40
Avatar
Pjanus
Člen
Avatar
Odpovídá na nickname01
Pjanus:27.3.2018 14:47
  1. blbě se bude odhadovat bude to záležet na velikosti ale podle toho co jsem našel tak cca 50x a i kdyby 2x pořád by to bylo hodně https://stackoverflow.com/…arge-numbers. B) dejme tomu pokud děláš kalkulačku můžeš použít biginteger (i když double by dával mnohem větší smysl). Problém není v tom, že neexistuje využití pro biginteger jenom je to opravdu malá část. Proto ano typicky u matematických aplikací se biginteger použít dá ,ale jinak je šílenství ho používat místo všech intů.
 
Nahoru Odpovědět
27.3.2018 14:47
Avatar
nickname01
Člen
Avatar
Odpovídá na Pjanus
nickname01:27.3.2018 15:34

Že dvakrát pomalejší je hodně?! Kdybych programoval běžně náročnou aplikaci, byla by mi úplně jedno i ta 50x větší náročnost - nedokážu si představit že by se něco takového v běžně náročné aplikaci dalo rozpoznat

 
Nahoru Odpovědět
27.3.2018 15:34
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na nickname01
Martin Dráb:27.3.2018 15:48

A to je ten rozdíl ve výkonu tak strašně zásadní, že se int/long používá i když se neomezený prostor hodí, nebo má int ještě nějakou výhodu?

Zjednodušeně řečeno, bigint je při operaci rozdělen na menší jednotky, pro které již existují instrukce (např. sčítání velkého intu lze řešit jako posloupnost sčítání jeho částí + nějaká ta režie, podobně třeba násobení). U normálního intu (i long long int na 64bitových platformách) se prostě použije jedna instrukce a je hotovo.

Že dvakrát pomalejší je hodně?! Kdybych programoval běžně náročnou aplikaci, byla by mi úplně jedno i ta 50x větší náročnost - nedokážu si představit že by se něco takového v běžně náročné aplikaci dalo rozpoznat

To záleží, co ta obyčejná aplikace s čísly dělá. Pokud by třeba komprimovala data, určitě nechceš, aby autoři kompresní knihovny zvolili tvůj přístup :-). Pokud děláš nějaké triviálnější výpočty (průměry, střední hodnoty, histogramy...), tak nastanou problémy na větších datech.

Takže spíš je třeba uvést příklad aplikace, která s čísly bude pracovat dostatečně málo.

U výpočtově náročnější aplikace může být dost velkým problémem fakt, že používá double. Po přepsání na inty lze dosáhnout zajímavých zrychlení, které v praxi rozhodují o tom, zda je použitelná (osobní zkušenost).

Nahoru Odpovědět
27.3.2018 15:48
2 + 2 = 5 for extremely large values of 2
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 12 zpráv z 12.