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

C# .NET .NET (C# a Visual Basic) Proč používat omezený int, když máme neomezený BigInteger American English version English version

Aktivity (3)
Avatar
nickname01
Člen
Avatar
nickname01:26. března 18:23

V čem je tedy int lepší?

 
Odpovědět 26. března 18:23
Avatar
Marian Benčat
Redaktor
Avatar
Odpovídá na nickname01
Marian Benčat:26. března 18:41

Výkon a atomicita.

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

Co je atomicita?

 
Nahoru Odpovědět 26. března 19:08
Avatar
Roman
Člen
Avatar
Odpovídá na nickname01
Roman:26. března 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. března 19:54
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na nickname01
Martin Dráb:26. března 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  +4 26. března 20:02
2 + 2 = 5 for extremely large values of 2
Avatar
Marian Benčat
Redaktor
Avatar
Odpovídá na Martin Dráb
Marian Benčat:26. března 20:59

Lépe bych to nevysvětlil.

Nahoru Odpovědět 26. března 20:59
Totalitní admini..
Avatar
nickname01
Člen
Avatar
nickname01:27. března 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. března 14:05
Avatar
Pjanus
Člen
Avatar
Odpovídá na nickname01
Pjanus:27. března 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  +1 27. března 14:22
Avatar
nickname01
Člen
Avatar
Odpovídá na Pjanus
nickname01:27. března 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. března 14:40
Avatar
Pjanus
Člen
Avatar
Odpovídá na nickname01
Pjanus:27. března 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  +1 27. března 14:47
Avatar
nickname01
Člen
Avatar
Odpovídá na Pjanus
nickname01:27. března 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  -3 27. března 15:34
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na nickname01
Martin Dráb:27. března 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  +4 27. března 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.