Autor Zpráva
Codename_47
Profil *
Zdravim. Pokial viem, c++ moze do premennej typu unsigned long int ukladaat cisla v rozsahu 0 - nieco okolo 4 290 000 000... Ja by som potreboval ulozit 20 miestne cislo. Mozno aj viac, najlespie by to bolo neobmezene. Ale nie ako retazec, potrebujem s nim normalne pracovat (tada najme sposobom cislo++ a potom ho zapisat do suboru). Ako sa to da?
PS: ked robim web v c(#/++)/ASP nieje to az tak offtopic :)
thingwath
Profil
Nemusíš to ukládat do řetězce, ale princip bude stejný. Procesor nemůže pracovat s neomezeným rozsahem, musí se to nějak ošetřit. Buďto sám nebo nějakou knihovnou. Zrovna v C++ by se to dalo udělat tak, že to nebude ani na první pohled poznat :-) Například cislo++ není nejmenší problém.
Codename_47
Profil *
?
nechapem.. tak dobre, myslim ze 20miestne cislo by mi malo stacit... ale ked napisem

#include <iostream>


int main()
{
unsigned long int cislo = 4294967294;

for (int i = 0; i < 20; i++)
{
std::cout << cislo << std::endl;
cislo++;
}

return 0;
}


vypise mi to

4294967294

4294967295
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17


a prave to nechcem, chcem aby to pokracovalo...
WanTo
Profil
Codename_47
Víc se do toho čísla prostě nevejde, má jen 32 bitů. Jak říká thingwath, budeš si muset napsat nějaké funkce, které budou pracovat třeba s polem bajtů (v C++ myslím unsigned char) popř. sehnat nějakou knihovnu.


Jinak v Javě je toto řešeno třídou BigInteger, můžeš zkusit sehnat její zdrojáky a nějak chytře je přepsat do C++ :-)
thingwath
Profil
Pro C++ je takových knihoven taky dost a troufnu si říct, že kvůli přetížitelným operatorům budou ještě hezčí :-)
Codename_47
Profil *
Ano, potom sa s tým možno pohrám, ale ja to potrebujem do zajtra. Neviete uź o nejakom hotovom riešení?

mm, myslim že tu funkciu čo spomínaš s poľom by som nejako vedel zosnovať. Teda ak som to pochopil správne -
uložím napr
int pole[pocet_cislic]
pole[0] = 1;
pole[1] = 7;
pole[2] = 2;
pole[3] = 5;
...

a ktomu by som si napisal nejaku navysovaciu funkciu? teda aspon tak som to pochopil ja

k tej Jave - to BigInteger to je typ premennej alebo funkcia (alebo skôr trieda, kedze je rec o Jave :)?
WanTo
Profil
No jo, ty přetížené operátory. Taky bych je v Javě občas uvítal :-)
WanTo
Profil
k tej Jave - to BigInteger to je typ premennej alebo funkcia (alebo skôr trieda, kedze je rec o Jave :)?
Třída, takže vlastně typ objektové proměnné. V Javě se nemůže jen tak někde poflakovat funkce, prostě všechno hezky ve třídě.
thingwath
Profil
No, pokud by stačilo 64 bitů, je v céčku ještě long long int, ale nevím jak se na to bude tvářit c++ kompilátor (nebo starší C kompilátor).
WanTo
Profil
thingwath
Tak pod g++ mi long long int jede, sizeof(long long int) dokonce píše i těch 8 bajtů.
thingwath
Profil
Každopádně pokud ti jde jenom o nějaké navyšování o jedničku, tak zřejmě nepotřebuješ žádné obecné implementace čísel s libovolnou přesností ale třeba bys to mohl nějak zjednodušit. Opravdu potřebuješ tak velká čísla?
Codename_47
Profil *
Procesor nemůže pracovat s neomezeným rozsahem, musí se to nějak ošetřit.

A ako je to teda v pythone?
skusil som:
>>> a = 5556189446579841321874516666668

>>> b = 2316876511987465132188794123549
>>> print a*b
12873004824933466991091204030764224421050309596017578042164732

vypisalo sa to skvor ako som pustil eneter...

alebo
>>> 5000**5000

>>> toto si viete domysliet :)

trvalo to ani nie 2 sekundy

Opravdu potřebuješ tak velká čísla?
som si isty ze viac ako 200 miest potrebovat nebudem :)
ale vazne, tie cisla budu dost velke, a najhorsie je to, ze neviem ako velmi
thingwath
Profil
V Pythonu je to přesně tak jak je napsáno v dokumentaci:

Plain integers (also just called integers) are implemented using long in C, which gives them at least 32 bits of precision. Long integers have unlimited precision.

Numbers are created by numeric literals or as the result of built-in functions and operators. Unadorned integer literals (including hex and octal numbers) yield plain integers unless the value they denote is too large to be represented as a plain integer, in which case they yield a long integer. Integer literals with an "L" or "l" suffix yield long integers ("L" is preferred because "1l" looks too much like eleven!).

V Pythonu to jako intepretovaném a navíc dynamicky typovaném jazyce je přeci jenom o něco jiné kafčo.
WanTo
Profil
Codename_47
Python pravděpodobně sám dokáže poznat, jak velké číslo použít. Sice mu nerozumím, ale myslím si, že stejně pracuje nad nějakým polem bajtů, ve kterém jsou uložené bity čísla.


som si isty ze viac ako 200 miest potrebovat nebudem :)
Tak piš v Pythonu :-)
thingwath
Profil
Python má hlavně výhodu, že i ten integer je objekt, což v C++ neplatí (bohužel ani v Javě, kde se něco málo zachraňuje zapouzdřujícími typy, ale je to nekoncepčně blbé).
WanTo
Profil
Python má hlavně výhodu
Výhodu? Mně to jako výhoda nepřipadá.
thingwath
Profil
Primitivní datové typy v Javě jsou zlo :-) Hnal bych to hned... :-)
WanTo
Profil
thingwath
Co se ti na nich nelíbí?
Codename_47
Profil *
long long int by teda ked spravne pocitam malo byt najviac 18446744073709552000. To je 20 miest a to by mohlo stacit.
Zaujimave je, ze do premennej nemozem sice priradit cislo vacsie ako 4294967295, ale ta vyssie uvedena funkcia to rata podom dobre, teda az (predpokladam) do 18446744073709552000.... Dalsia zaujimava vec je, ze nemozem napisat ani nic vacsie ako cislo += 4294967295 :)))
INak to pise "error: integer constant is too large for ‘long’ type".

Tak piš v Pythonu :-)

no, ja som tiez dnas spustil ten "shell" pythonu asi 3 krat v zivote, a zatial sa mi ho velmi nechce ucit. k tomu sa mi nepaci syntax :)

thingwath
takze v pythone je na to nejaka (ako teda myslim v samotnom interprete) je na to nejaka funkcia ?
Codename_47
Profil *
fiha, len tak som si skusil napisat
std::cout << sizeof(long long long int);

a aha ho - error: ‘long long long’ is too long for GCC
to znamena, ze existuje aj 3long int typ, akurat ho GCC nevie pouzit ?
thingwath
Profil
long long long už prostě není :-)

Python má něco co sháníš zabudované a kvůli dynamickému typováni a faktu, že i ty integery jsou objekty to dokáže použít tak, že to ani nepostřehneš. Když to vypíšeš bez printu, bude u dlouhých čísel na konci L, ve shodě s dokumentací.

Prostě si na to sežeň nějakou knihovnu. Třeba tuhle: http://www.swox.com/gmp/ , nezapomeň použít C++ rozhraní místo toho céčkového.

WanTo
Proč by všechno nemohlo být objekt? Něco se nelíbí třeba na:
254.toString ()
(to možná nebude dvakrát užitečný příklad, ale tak zhruba...)
Toto téma je uzamčeno. Odpověď nelze zaslat.

0