PDA

Pogledaj cijelu verziju : C++ par pitanja



HalF-DeaD
16-07-2008, 18:22
Evo i mene pokusavam uciti C++ :)
Imam Visual C++ 2008 EE, pratim knjigu Demistificirani C++ (2. izdanje) i imam par pitanja.

1. Zadatak ide ovako:
Odredite koje ce od navedenih naredbi za ispis dati ispravan umnozak, tj. 20 000 000 000.


int a = 100000;
int b = 200000;
long c = a * b;

cout << c << endl;
cout << (a * b) << endl;
cout << (static_cast<float>(a) * b) << endl;
cout << static_cast<long>(a * b) << endl;
cout << (a * static_cast<long>(b)) << endl;

Kada krenem izvrsavati program na ekranu dobijem sljedece:


-1474836480
-1474836480
-2e+010
-1474836480
-1474836480


Gdje je greska?

2. Sto znaci ovo "e" u "-2e+010"? Kolko sam skuzio ima veze sa realnim i imaginarnim brojevima, ali ne kuzim sta tocno.

Luka
17-07-2008, 12:11
-2e+010
to je znanstvena notacija, čita se kao <broj_ispred_e> * 10^ <broj_iza_e>
i to je ujedno ispravan rezultat, kod ostalih dolazi do numeričkog preljeva pa je zato rezultat netočan

Tracer
17-07-2008, 12:20
@HalF-DeaD

Maksimalan broj koji se sa int tj. long može prikazati jest 2147483647 a preko toga ide se u preljev, tj. u negativno područje. S druge strane, float tip ima proširenje do 3.4E +/- 38 i zato se preko treće opcije (float) može točno prikazati rezultat.

Inače, u ovakvim slučajevima se koristi 64 bitni integer tj.


cout << (a * static_cast<long long>(b)) << endl;

koji je u ovom slučaju najtočnije rješenje a i po zadanom formatu.

HalF-DeaD
17-07-2008, 13:06
Puno hvala na odgovorima. Sad imam jos dva pitanja.

1. Zar nebi onda -2e+010 trebalo biti -20 000 000 000?
2. Zasto je ovdje 010 (oktalno 8) umjesto 10?

Luka
17-07-2008, 13:08
meni prevoditelj daje 2e+10