Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Incalzire in pardoseala etapizata

Suprataxa card energie?!

Cum era nivelul de trai cam din a...

probleme cu ochelarii
 Impozite pe proprietati de anul v...

teava rezistenta panou apa calda

Acces in Curte din Drum National

Sub mobila de bucatarie si sub fr...
 Rezultat RMN

Numar circuite IPAT si prindere t...

Pareri brgimportchina.ro - teapa ...

Lucruri inaintea vremurilor lor
 Discuții despre TVR Sport HD.

Cost abonament clinica privata

Tremura toata, dar nu de la ro...

Renault Android
 

limitele primitivelor in c++

- - - - -
  • Please log in to reply
25 replies to this topic

#1
Daniel2222

Daniel2222

    Junior Member

  • Grup: Members
  • Posts: 196
  • Înscris: 21.07.2015
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
sftpdt

sftpdt

    Senior Member

  • Grup: Senior Members
  • Posts: 3,649
  • Înscris: 29.08.2013

Quote

Si ce reprezinta acel e+06?
106

Edited by sftpdt, 06 June 2017 - 22:17.


#3
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,383
  • Înscris: 10.08.2005

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.
O luna are maxim 31 de zile
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.
Pai ce alte primitive mai suporta limbajul ?

Edited by MarianG, 06 June 2017 - 22:24.


#4
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006
Google: bigfloat implementation in C++

#5
Daniel2222

Daniel2222

    Junior Member

  • Grup: Members
  • Posts: 196
  • Înscris: 21.07.2015

 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
red46

red46

    Senior Member

  • Grup: Senior Members
  • Posts: 4,528
  • Înscris: 06.03.2016

 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.
Folosești int? Asta dacă nu te interesează neaparat precizia.

Edited by red46, 06 June 2017 - 22:27.


#7
Daniel2222

Daniel2222

    Junior Member

  • Grup: Members
  • Posts: 196
  • Înscris: 21.07.2015

 OriginalCopy, on 06 iunie 2017 - 22:24, said:

Google: bigfloat implementation in C++
Asta cautam.
Multumesc frumos, se poate inchide.

#8
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,383
  • Înscris: 10.08.2005

 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.
Eu n-am vazut sa le depaseasca.

 red46, on 06 iunie 2017 - 22:27, said:

Folosești int? Asta dacă nu te interesează neaparat precizia.
pai il intereseaza
centi (sutimi) --> dolari (reali), ai nevoie de fixed o precizie 2 (zecimale)

Edited by MarianG, 06 June 2017 - 23:08.


#9
neagu_laurentiu

neagu_laurentiu

    Guru Member

  • Grup: Senior Members
  • Posts: 40,570
  • Înscris: 30.07.2003

 Daniel2222, on 06 iunie 2017 - 22:12, said:

float
Ai si double la dispozitie care-i mai generos: https://msdn.microso...y/hd7199ke.aspx

#10
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,383
  • Înscris: 10.08.2005
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.
Nu observa nimeni nimic ?

cout << endl << std::numeric_limits<float>::max() << endl;
Spoiler

Edited by MarianG, 07 June 2017 - 08:38.


#11
neagu_laurentiu

neagu_laurentiu

    Guru Member

  • Grup: Senior Members
  • Posts: 40,570
  • Înscris: 30.07.2003
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
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,383
  • Înscris: 10.08.2005
Omul a spus ca ii este depasita limita, lucru de care ma indoiesc.

Cum ramane cu cealalta problema, de dupa virgula ?

#13
tavitu

tavitu

    Minune: HE a început să emită facturile!

  • Grup: Senior Members
  • Posts: 5,598
  • Înscris: 16.02.2009
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
neagu_laurentiu

neagu_laurentiu

    Guru Member

  • Grup: Senior Members
  • Posts: 40,570
  • Înscris: 30.07.2003

 MarianG, on 07 iunie 2017 - 09:48, said:

Cum ramane cu cealalta problema, de dupa virgula ?
La stanga sau la dreapta dupa virgula nu conteaza, per total numai pe pe 6~7 (unitati.zecimale) te poti baza in cazul float. Sigur, ca poti pune zero cat incape dar capetele tot in acea precizie se regasete.

Edited by neagu_laurentiu, 07 June 2017 - 10:11.


#15
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,383
  • Înscris: 10.08.2005
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
neagu_laurentiu

neagu_laurentiu

    Guru Member

  • Grup: Senior Members
  • Posts: 40,570
  • Înscris: 30.07.2003

 MarianG, on 07 iunie 2017 - 10:09, said:

suma_dolari / 100.0
Aici iesi din float.

#17
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,383
  • Înscris: 10.08.2005
Pai impart la un float, cum ies ?

#18
neagu_laurentiu

neagu_laurentiu

    Guru Member

  • Grup: Senior Members
  • Posts: 40,570
  • Înscris: 30.07.2003
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

Bun venit pe Forumul Softpedia!

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate