zdravím všechny.. mám jednu otázku spíše jenom ze zvědavosti.. učím se teď programovat v C++ a zároveň se trochu zlepšovat v C. Nechci počítat pí, jak se možná může zdát z názvu tématu, jen mě zajímá... když má typ long double nevím kolik řekněme přesnost dvacet číslic, jak je možné, že některé programy jej počítají třeba na 1000 desetiných míst atd. podobně mám otázku jak se ukládají opravdu obrovká čísla, třeba prvočísla, protože typ long int určitě nestačí a typ long double má omezenou přesnost. ptám se i proto, protože někdy by se mi hodilo uložit i nějaké větší číslo než něco přes 4e+9, ovšem bez ztráty přesnosti. zároveň ještě poslední dotaz: když je na mém počítači typ long int stejně velký jako typ int, proč to tak vůbec je? možná se ptám hloupě ale přijde mi nelogické že jsou tyto dva typy stejně velké (úplně stejně na jiných počítačích je to zase myslím short a int - taky nechápu proč). ptám se jenom ze zvědavosti a taky abych možná některé věci lépe chápal, děkuji za případnou odpověď.
Fórum › C / C++
Výpočet pí, velká čísla, long int / int
Začnu od velikosti typů - je to dané standardem - např. int je definován jako typ, který je schopen pojmout čísla od -32768 do +32767. Může však být větší. Záleží na platformě. Na PC se int běžně implementuje jako 32-bitový (místo 16-bit), protože CPU má hardwarovou aritmetickou jednotku, která dokáže zpracovávat 32-bit čísla rychle. Navíc jsou 32-bit čísla automaticky zarovnána do paměti, takže je přístup k ni rychlejší. Je to stejný důvod, proč na windows je typ BOOL (neplést s bool) reprezentován 32-bit číslem, ačkoliv teoreticky stačí jeden bit - protože je zarovnaný a přístup k němu je rychlý. Je to sice plýtvání pamětí, ale v dnešní době to nehraje zase tak velkou roli.
Velká čísla se ukládají do speciálních struktur - často reprezentovanými třídami. Jsou uložena např. jako pole int, čímž dosáhnu např. 512-bitového datového typu. Avšak veškeré operace s těmito číslo je nutné znovu implementovat - CPU nedokáže nativně takto velká čísla zpracovávat. Takže se např. sčítají či násobí po částech, ošetřuje se "přechod přes 32 bitů" (obdoba počítání v první třídě "přechod přes desítku") atd.
Další možností jak reprezentovat čísla je textově. Tzn. číslo je uloženo jako text. S takovým to vyjádřením lze dosáhnout absolutní přesnosti, prootže např. 1/3 bude skutečně uložena jako "jedna lomeno tři", nikoliv jako 0.333333. Toto vyjádření se často používá u matematických programů.
Co sa tyka tych short/long intov tak plati toto:
short int <= int <= long int <= long long int
Velkost moze byt na roznych platformach rozna.
#6 jano
Ne, tak to není. Tento předpoklad komplikuje převod spousty aplikací do 64-bitové verze. Minimálně v mém linuxu je int 32-bitů, ale ukazatele 64-bitů. Ukazatel se vejde (v mém případě) až do longu. Ale spolehlivě se vejde do typu uintptr_t nebo intptr_t. Všude.
Pokud tento typ v headeru stdint.h nebo cstdint nemáš, můžeš si nadefinovat vlastní a pak tam strčit compile-time assert kontrolující, že velikost ukazatele není větší než velikost toho intu.
#8 yaqwsx
zalezi na datovem modelu, linux pouziva tusim LP64/I32LP64 - 32b Int + 64b long, pointer
ale jsou i systemy co pouzivaji modely jako ILP64 nebo dokonce SILP64 (i short je pak 64b)
woknouze v 64b pry pouzivaji LLP64/IL32P64 - long=32b, int 32b, long long 64b, pointer 64b
#7 ondra.holub
ja sem zkusil pouzit intptr_t, deklaroval jsem promennou. zbarvilo se mi stejne jako klicove slovo C++, ale při pokusu o přeložení se mi otevřel soubor c++0x_warning.h, kde sem byl odkázán na tento error:
#error This file requires compiler and library support for the upcoming \
ISO C++ standard, C++0x. This support is currently experimental, and must be \
enabled with the -std=c++0x or -std=gnu++0x compiler options.
má angličtina není moc dobrá, nemohl by mi někdo pomoct, co to znamená? používám Code::Blocks, možná tady je problém, nevím.
gcc starsie ako 4.7 neprekladaju kod v standarte c++11 (pracovna verzia c++0x), takze ked chces pouzit sucast tochto noveho standartu tak musis prekladat kod z flagom -std=c++0x or -std=gnu++0x
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Výpis "unsigned long long int" po bitech — založil Kuba
Tisk long long int — založil Tereza
Graphics2D .create(int, int, int, int) - problém — založil Havel
Nieco viac ako unsigned long int — založil entity
Pole záznamů (každý String, int, int, ...) — založil MpPozor
Moderátoři diskuze