potęgowanie- wartość o 1 mniejsza

0

Witam , miałem zamiar napisać program który jakąś liczbę z programu w tym wypadku (max_size) stringa zapisze do tablicy char w postaci:
liczba=2345
t[0]=2
t[1]=3
t[2]=4
t[3]=5

   string h;
   int k=h.max_size();
  
   cout<<k<<endl;
   int jed[10];
   int n=10;
   for(int i=0;i<n;i++)
   {    
           jed[i]=(k/(pow(10,(n-i-1))));  //tutaj dzielimy liczbę by uzyskać pierwszą cyfrę
           int m=pow(10,(n-i-1));      
           cout<<"i= "<<i<<"  m= "<<m<<endl; //pomocnicze -tutaj jest błąd m = 999999999 zamiast 1000000000
    long int x=jed[i]*m;
   cout<<"odejmujemy "<< k <<" (k) - "<<x<<"  "<<   "jed[i]=" <<jed[i]<<endl; //pomocnicze
  
   k-=x; 
   
   } 

Zrobiłem kilka wyświetleń pomocniczych na których widać że przy potęgowaniu np. 10^9 zamiast liczby 1000000000 jest 999999999. Dlaczego tak się dzieje ?
Dla wygody pokażę jak to ma wyglądać:

mam liczbę 1045
dzielę ją na 1000 =>zostaje 1 <-
1 mnożę razy 1000 =1000
od 1045-1000 = 045

45/100 =>0 <-
0*100=>0
45-0=45

45/10=>4 <-
4*10=>40
45-40=>5

5/1=>5 <-
5*1=>5
5-5=0

0

pow zwraca liczbę zmiennoprzecinkową. dalej masz błędy wynikające z precyzji zapisu i zaokrągleń.

1

Może ci chodzi o coś takiego:

   string h;
   stringstream s(ios::out);
   s<<h.max_size();
   char t[16]={0};
   memcpy(t,s.str()[0],s.str().size());

albo o:

   string h;
   unsigned k=h.max_size();
   char t[16];
   unsigned p=0;
   while(k||!p)
     {
      t[p++]='0'+k%10;
      k/=10;
     }
   t[p--]=0;
   for(k=0;k<p;++k,--p) swap(t[p],t[k]);

albo o:

   string h;
   char t[16];
   sprintf(t,"%d",h.max_size());
0

o właśnie, dzięki , a propoS funkcji pow , to pomimo że zwraca double to przecież 10 ^ 9 to nie jest 999999999 , więc nie za bardzo rozumiem dlaczego taką wartość zwraca.
_13th_Dragon 1 i 3 funkcja nie działa u mnie nie wie co to jest ssprintf i stringstream nie potrzeba jakiejś biblioteki dodatkowej oprócz <string> ?

1
luko91 napisał(a):

o właśnie, dzięki , a propoS funkcji pow , to pomimo że zwraca double to przecież 10 ^ 9 to nie jest 999999999 , więc nie za bardzo rozumiem dlaczego taką wartość zwraca.
funkcja pow(10,9) zwraca ci wartość 999999999.999999999999 zaś po przekształceniu na int (odrzuca część ułamkową) wychodzi dokładnie 999999999.

0

hm, trochę dziwne że nie przechowuje pełnej wartości, dzięki za odp.

1

albo round użyć po prostu

1 użytkowników online, w tym zalogowanych: 0, gości: 1