Výpočet pí, velká čísla, long int / int – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Výpočet pí, velká čísla, long int / int – C / C++ – Fórum – Programujte.comVýpočet pí, velká čísla, long int / int – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Libor
~ Anonymní uživatel
90 příspěvků
27. 7. 2012   #1
-
0
-

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ěď.

Nahlásit jako SPAM
IP: 93.99.200.–
Reklama
Reklama
Libor
~ Anonymní uživatel
90 příspěvků
27. 7. 2012   #2
-
0
-

#1 Libor

že některé programy jej počítají třeba na 1000 desetiných míst atd.

toto jsem nevyjádřil moc přesně, myslel jsem právě ty výpočty pí, které mají miliony číslic

Nahlásit jako SPAM
IP: 93.99.200.–
yaqwsx+9
Posthunter
27. 7. 2012   #3
-
+1
-
Zajímavé

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ů.

Nahlásit jako SPAM
IP: 85.160.33.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
vitamin+8
Grafoman
27. 7. 2012   #4
-
0
-

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.

Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Libor
~ Anonymní uživatel
90 příspěvků
27. 7. 2012   #5
-
0
-

#4 vitamin
#3 yaqwsx

dekuji za vase odpovedi. vitamin - ano tuto tabulku znam, ale neuskodi ji pripomenout. byla jak v knize od herouta tak v dalsi knizce co ted ctu (asi ji davaji vsude...). yaqwsx- děkuji také za odpovědi..

Nahlásit jako SPAM
IP: 93.99.200.–
jano
~ Anonymní uživatel
53 příspěvků
27. 7. 2012   #6
-
0
-

int by mal byt tak velky ako velkost adresy v pamati.

na vacsiu presnost sa pouzivaju kniznice GMP alebo NTL pripadne ine...

Nahlásit jako SPAM
IP: 85.135.183.–
ondra.holub+1
Stálý člen
28. 7. 2012   #7
-
+1
-
Zajímavé

#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.

Nahlásit jako SPAM
IP: 212.96.189.–
yaqwsx+9
Posthunter
28. 7. 2012   #8
-
0
-

#6 jano
O tom, že int by měl být stejně velký jako max. adresa pointru jsem nikdy neslyšel. Nepleteš  si to náhodou s typem size_t? U něj to platí.

Nahlásit jako SPAM
IP: 85.160.33.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
KIIV+42
God of flame
28. 7. 2012   #9
-
0
-

#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

Nahlásit jako SPAM
IP: 62.245.85.–
Program vždy dělá to co naprogramujete, ne to co chcete...
__Libor0
Duch
28. 7. 2012   #10
-
0
-

#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. 

Nahlásit jako SPAM
IP: 93.99.200.–
vitamin+8
Grafoman
28. 7. 2012   #11
-
0
-

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

Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
yaqwsx+9
Posthunter
28. 7. 2012   #12
-
0
-

#9 KIIV
Aha, díky za doplnění. Nějak se na mě projevuje, že jsem primárně Windows vývojář... :D

Nahlásit jako SPAM
IP: 85.160.15.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 86 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý