limitele primitivelor in c++
#1
Posted 06 June 2017 - 22:12
Am vazut intr-un film o discutie destul de interesanta.
Spuneau acolo ca daca ai de dat cuiva un cent si in cazul in care nu-l platesti suma de plata se dubleaza zilnic, o sa ajungi intr-o luna de zile sa platesti peste 10 milioane de dolari. Mi s-a parut interesant acest lucru si am vrut sa vad daca are dreptate acel personaj din film. Am scris un program in c++ dar nu am rezolvat mare lucru pentru ca limitele variabilei float sunt prea mici si le depasesc. Raspunsul il stiu la aceasta problema acum, in 30 de zile nu ajungi la acea suma dar in 31 da. Mai ramane curiozitatea cu codul. Acsta este rezultatul:
Spoiler
Problema e ca din ziua 28 rezultatul nu mai e corect, presupun ca sunt depasite limitele primitivei float. Dar cum pot mari aceste limite? Ce pot folosi in codul de mai jos in loc de acel float? Si ce reprezinta acel e+06? Codul sursa #include <iostream> using namespace std; void calculeaza(); int main() { calculeaza(); cin.get(); return 0; } void calculeaza() { float suma_dolari = 0.01f; int nr_zi = 1; while (nr_zi<31) { cout << "Suntem in ziua " << nr_zi << " si avem de plata " << suma_dolari<<" dolari."<<endl; suma_dolari *= 2; nr_zi++; } } Edited by Daniel2222, 06 June 2017 - 22:21. |
#2
Posted 06 June 2017 - 22:15
Quote Si ce reprezinta acel e+06? Edited by sftpdt, 06 June 2017 - 22:17. |
#3
Posted 06 June 2017 - 22:17
Quote Spuneau acolo ca daca ai de dat cuiva un cent si in cazul in care nu-l platesti suma de plata se dubleaza zilnic, o sa ajungi intr-o luna de zile sa platesti peste 10 milioane de dolari. 1 cent * 2 ^ 31 = 2147483648 centi Quote
Problema e ca din ziua 28 rezultatul nu mai e corect, presupun ca sunt depasite limitele primitivei float. Edited by MarianG, 06 June 2017 - 22:24. |
#5
Posted 06 June 2017 - 22:25
MarianG, on 06 iunie 2017 - 22:17, said:
O luna are maxim 31 de zile 1 cent * 2 ^ 31 = 2147483648 centi Pai ce alte primitive mai suporta limbajul ? bun, ai dreptate eu eram curios ce poti folosi in cazul in care ai de lucrat cu o cifra foarte mare care depaseste acele limite. Edited by Daniel2222, 06 June 2017 - 22:26. |
#6
Posted 06 June 2017 - 22:27
#7
Posted 06 June 2017 - 22:29
#8
Posted 06 June 2017 - 22:40
Daniel2222, on 06 iunie 2017 - 22:25, said:
bun, ai dreptate eu eram curios ce poti folosi in cazul in care ai de lucrat cu o cifra foarte mare care depaseste acele limite. red46, on 06 iunie 2017 - 22:27, said:
Folosești int? Asta dacă nu te interesează neaparat precizia. centi (sutimi) --> dolari (reali), ai nevoie de fixed o precizie 2 (zecimale) Edited by MarianG, 06 June 2017 - 23:08. |
#9
Posted 07 June 2017 - 05:16
Daniel2222, on 06 iunie 2017 - 22:12, said:
float |
#10
Posted 07 June 2017 - 08:28
Chiar si asa,
Quote Suntem in ziua 21 si avem de plata 10485.8 dolari. Suntem in ziua 22 si avem de plata 20971.5 dolari. Suntem in ziua 23 si avem de plata 41943.0 dolari. Suntem in ziua 24 si avem de plata 83886.1 dolari. cout << endl << std::numeric_limits<float>::max() << endl;
Spoiler
Edited by MarianG, 07 June 2017 - 08:38. |
|
#11
Posted 07 June 2017 - 09:02
Numarul ala din 38 cifre e asa sa fie acolo, la float din toata marja posibila doar 6~7 sunt intocmai, restul sunt calcule si au abatere.
|
#12
Posted 07 June 2017 - 09:48
Omul a spus ca ii este depasita limita, lucru de care ma indoiesc.
Cum ramane cu cealalta problema, de dupa virgula ? |
#13
Posted 07 June 2017 - 09:58
Așa funcționează floating point. Nu este o reprezentare exactă, ci aproximativă. Într-o variabilă floating point nu este stocată valoarea pe care tu o vrei, ci o aproximare a acestei valori. Dacă vrei o reprezentare exactă trebuie să folosești alte tipuri de date, decimal, integer, biginteger, etc.
|
#14
Posted 07 June 2017 - 10:08
MarianG, on 07 iunie 2017 - 09:48, said:
Cum ramane cu cealalta problema, de dupa virgula ? Edited by neagu_laurentiu, 07 June 2017 - 10:11. |
#15
Posted 07 June 2017 - 10:09
Adevarat, dar nu tinem cont de aceasta abatere?
uite, acelasi tip de variabila, aceasi dublare a valorii, void calculeaza() { float suma_dolari = 1.0; int nr_zi = 1; while (nr_zi < 31) { cout << "Suntem in ziua " << nr_zi << " si avem de plata " << suma_dolari / 100.0 << " dolari." << endl; suma_dolari *= 2; nr_zi++; } } Quote Suntem in ziua 1 si avem de plata 0.010000 dolari. Suntem in ziua 2 si avem de plata 0.020000 dolari. Suntem in ziua 3 si avem de plata 0.040000 dolari. Suntem in ziua 4 si avem de plata 0.080000 dolari. Suntem in ziua 5 si avem de plata 0.160000 dolari. Suntem in ziua 6 si avem de plata 0.320000 dolari. Suntem in ziua 7 si avem de plata 0.640000 dolari. Suntem in ziua 8 si avem de plata 1.280000 dolari. Suntem in ziua 9 si avem de plata 2.560000 dolari. Suntem in ziua 10 si avem de plata 5.120000 dolari. Suntem in ziua 11 si avem de plata 10.240000 dolari. Suntem in ziua 12 si avem de plata 20.480000 dolari. Suntem in ziua 13 si avem de plata 40.960000 dolari. Suntem in ziua 14 si avem de plata 81.920000 dolari. Suntem in ziua 15 si avem de plata 163.840000 dolari. Suntem in ziua 16 si avem de plata 327.680000 dolari. Suntem in ziua 17 si avem de plata 655.360000 dolari. Suntem in ziua 18 si avem de plata 1310.720000 dolari. Suntem in ziua 19 si avem de plata 2621.440000 dolari. Suntem in ziua 20 si avem de plata 5242.880000 dolari. Suntem in ziua 21 si avem de plata 10485.760000 dolari. Suntem in ziua 22 si avem de plata 20971.520000 dolari. Suntem in ziua 23 si avem de plata 41943.040000 dolari. Suntem in ziua 24 si avem de plata 83886.080000 dolari. Suntem in ziua 25 si avem de plata 167772.160000 dolari. Suntem in ziua 26 si avem de plata 335544.320000 dolari. Suntem in ziua 27 si avem de plata 671088.640000 dolari. Suntem in ziua 28 si avem de plata 1342177.280000 dolari. Suntem in ziua 29 si avem de plata 2684354.560000 dolari. Suntem in ziua 30 si avem de plata 5368709.120000 dolari. |
|
#16
Posted 07 June 2017 - 10:13
#18
Posted 07 June 2017 - 10:22
Ia pune intr-o variabila float valoarea 1342177.28 apoi uita-te in ea cu debuggerul. O mai ai ? Nu.
Type: float Number of bytes: 4 Significant digits: 6 - 7 Ce-i peste 6 (ori 7 dar pana in acele minime/maxime) e cancan. Edited by neagu_laurentiu, 07 June 2017 - 10:19. |
Anunturi
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users