zmienna o bardzo duzym rozmiarze

dział ogólny

zmienna o bardzo duzym rozmiarze

Nowy postprzez techew » wtorek, 17 lutego 2009, 11:47

Mam problem. Pisze program w C++- cos w rodzaju kalkulatora. Niekiedy mam do wyswietlenia duze liczby - conajmniej 18-cyfrowe. Kiedy wynik przekroczy pewien rozmiar otrzymuje liczbe w postaci: 1.5511210043331E25 przy czy przy wykonaniu tej samej operacji kalkulator Windowsa zwraca wynik: 15511210043330985984000000. Czy ktos moze wie jakiego typu zmiennej uzyc zeby przechowywac tego rozmiaru liczby?
Avatar użytkownika
techew
Bladawiec
Bladawiec
 
Posty: 40
Dołączył(a): piątek, 26 września 2008, 10:07
Podziękował : 0
Otrzymał podziękowań: 0
    NieznanyNieznana

Re: zmienna o bardzo duzym rozmiarze

Nowy postprzez polymorphism » wtorek, 17 lutego 2009, 13:28

A na jakim typie operujesz, double? Jeśli tak, to się nie dziw, bo precyzja double to 16 miejsc po przecinku. Spróbuj z long double.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: zmienna o bardzo duzym rozmiarze

Nowy postprzez techew » wtorek, 17 lutego 2009, 13:50

Przepraszam nie sprecyzowalam tego wczesniej, uzywam long int, w moim programie nie potrzebuje uzywac liczb zmiennoprzecinkowycch, dla przykladu wyliczajac silnie liczby 22 otrzymuje wynik, który nie miesci sie nawet w typie Vartiant, który ma 64 bity. jak juz wspomnialam zamiast uzyskac wynik w postaci: 15511210043330985984000000 otrzymuje: 1.5511210043331E25
Avatar użytkownika
techew
Bladawiec
Bladawiec
 
Posty: 40
Dołączył(a): piątek, 26 września 2008, 10:07
Podziękował : 0
Otrzymał podziękowań: 0
    NieznanyNieznana

Re: zmienna o bardzo duzym rozmiarze

Nowy postprzez polymorphism » wtorek, 17 lutego 2009, 14:05

Ok, tylko jakim cudem wynik wyświetla ci w postaci wykładniczej, jeśli mowa o long int, który powinien zmieścić liczbę 19 cyfrową - TeX: [\log(2^{63})]+1 ?

Pokaż jak konwertujesz tą liczbę na tekst, bo tu za pewne leży problem.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: zmienna o bardzo duzym rozmiarze

Nowy postprzez techew » wtorek, 17 lutego 2009, 14:13

To jest caly kod do wyliczania silni. akurat w tej 'probie' uzylam int64, ale okazuje sie za male. Po przekroczeniu 30! po prostu zwraca zero.

Kod: Zaznacz cały
//---------------------------------------------------------------------------

#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
#include <iostream>
#include <conio.h>

using namespace std;

__ int64 silnia(__int64 n)
{
  switch (n)
  {
   case 1:
      return 1;
      break;
   default:
      return n * silnia(n-1);

    
  }       
}
//--------------------------------------------------------------------------
int main(int argc, char* argv[])
{

int wej;
  cout << "Silnie jakiej liczby obliczyc?\n";
  cin >> wej;
  cout << silnia(wej);

   while(!kbhit());

   return 0;
}
//---------------------------------------------------------------------------



Probowalam zrobic to samo w wersji 32-bitowej, skladnia funkcji silnia rozni sie, ze zamiast int64 uzylam Variant (probowalam tez long int czy int64 - ten sam skutek), w zdarzeniu onClick przycisku dodalam kod:
Kod: Zaznacz cały
Edit2->Text=VarToStr(silnia(StrToInt(Edit1->Text)));
probowalam tez: Edit2->Text=silnia(StrToInt(Edit1->Text));



... bez zmian.
Ostatnio edytowano wtorek, 17 lutego 2009, 15:37 przez techew, łącznie edytowano 1 raz
Avatar użytkownika
techew
Bladawiec
Bladawiec
 
Posty: 40
Dołączył(a): piątek, 26 września 2008, 10:07
Podziękował : 0
Otrzymał podziękowań: 0
    NieznanyNieznana

Re: zmienna o bardzo duzym rozmiarze

Nowy postprzez polymorphism » wtorek, 17 lutego 2009, 14:25

Coś tu kręcisz. To, co dałaś powinno poprawnie wyświetlić liczbę. I na pewno nie powinna to być postać wykładnicza.

P.S. następnym razem kod w tagi :!:
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: zmienna o bardzo duzym rozmiarze

Nowy postprzez techew » wtorek, 17 lutego 2009, 14:30

dlaczego mialabym krecic? tak mi wyswietla :| nie wiem co jest nie tak, wg mnie tez powinno chodzic.
Avatar użytkownika
techew
Bladawiec
Bladawiec
 
Posty: 40
Dołączył(a): piątek, 26 września 2008, 10:07
Podziękował : 0
Otrzymał podziękowań: 0
    NieznanyNieznana

Re: zmienna o bardzo duzym rozmiarze

Nowy postprzez polymorphism » wtorek, 17 lutego 2009, 14:43

techew napisał(a):dlaczego mialabym krecic?

Bo nie ma takiej możliwości, żeby np. to:
Kod: Zaznacz cały
__int64 value = 1551121004333098598;
cout << value;

wyświetliło mi 1.551121004333098598E+18.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: zmienna o bardzo duzym rozmiarze

Nowy postprzez techew » wtorek, 17 lutego 2009, 14:55

fakt, kod który podales dziala, dziala nawet gdy go tak zmodyfikowalam:
Kod: Zaznacz cały
__int64 value =1551121004333098598*6;
Edit2->Text=value;

jednak kiedy juz uzylam:
Kod: Zaznacz cały
__int64 value =silnia(33);
Edit2->Text=value;

otrzymalam wynik: -2147483648
Avatar użytkownika
techew
Bladawiec
Bladawiec
 
Posty: 40
Dołączył(a): piątek, 26 września 2008, 10:07
Podziękował : 0
Otrzymał podziękowań: 0
    NieznanyNieznana

Re: zmienna o bardzo duzym rozmiarze

Nowy postprzez Miroo_007 » wtorek, 17 lutego 2009, 15:30

CodeGear C++ Builder 2007 błędnie konwertuje zmienną int do AnsiString. Możesz użyć coś takiego:
Kod: Zaznacz cały
__int64 value =silnia(33);
Edit2->Text = IntToStr(value);
Avatar użytkownika
Miroo_007
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): sobota, 18 października 2008, 10:49
Lokalizacja: Rzeszów
Podziękował : 0
Otrzymał podziękowań: 0
    NieznanyNieznana

Re: zmienna o bardzo duzym rozmiarze

Nowy postprzez techew » wtorek, 17 lutego 2009, 15:35

bez zmian :( niestety
Avatar użytkownika
techew
Bladawiec
Bladawiec
 
Posty: 40
Dołączył(a): piątek, 26 września 2008, 10:07
Podziękował : 0
Otrzymał podziękowań: 0
    NieznanyNieznana

Re: zmienna o bardzo duzym rozmiarze

Nowy postprzez wargo » wtorek, 17 lutego 2009, 15:53

Jesteś pewna że to funkcja silnia zwraca dobrze wynik?
Kod: Zaznacz cały
__int64 value =silnia(33);
if(value == 1551121004333098598)
{
ShowMessage("Funkcja zwraca właściwą liczbę");
}
else
{
ShowMessage("Błąd konwersji");
}
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
Podziękował : 12
Otrzymał podziękowań: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    NieznanyNieznana

Re: zmienna o bardzo duzym rozmiarze

Nowy postprzez techew » wtorek, 17 lutego 2009, 16:07

dziekuje za podpowiedz - to byla niezla mysl.
funkcja silnia dziala dobrze po warunkiem, ze n<13, kiedy argument jest wiekszy zwraca bzdure.
Avatar użytkownika
techew
Bladawiec
Bladawiec
 
Posty: 40
Dołączył(a): piątek, 26 września 2008, 10:07
Podziękował : 0
Otrzymał podziękowań: 0
    NieznanyNieznana

Re: zmienna o bardzo duzym rozmiarze

Nowy postprzez Cyfrowy Baron » środa, 18 lutego 2009, 11:40

Przy użyciu zmiennej typu long double, powinieneś otrzymać prawidłowy wynik dla n = 17.

Kod: Zaznacz cały
//---------------------------------------------------------------------------
long double silnia(long double n)
{
if(n == 0) return 1;
return n * silnia(n - 1);
}
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Edit1->Text = FloatToStr(silnia(17));
}
//---------------------------------------------------------------------------


WYNIK: 355687428096000



Stosując zmienną __int64 uzyskałem prawidłowy wynik dla n = 39

Kod: Zaznacz cały
//---------------------------------------------------------------------------
__int64 silnia(__int64 n)
{
if(n == 0) return 1;
return n * silnia(n - 1);
}
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Edit1->Text = IntToStr(silnia(39));
}
//---------------------------------------------------------------------------


WYNIK: 2304077777655037952



Tutaj masz błąd:

Kod: Zaznacz cały
int main(int argc, char* argv[])
{

int wej;
  cout << "Silnie jakiej liczby obliczyc?\n";
  cin >> wej;
  cout << silnia(wej);

   while(!kbhit());

   return 0;
}


Powinno być:

Kod: Zaznacz cały
int main(int argc, char* argv[])
{

  __int64 wej;
  cout << "Silnie jakiej liczby obliczyc?\n";
  cin >> wej;
  cout << silnia(wej);

   while(!kbhit());

   return 0;
}
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: zmienna o bardzo duzym rozmiarze

Nowy postprzez Witold » środa, 18 lutego 2009, 16:13

Cyfrowy Baron napisał(a):Stosując zmienną __int64 uzyskałem prawidłowy wynik dla n = 39

Raczej nie, dla __int64 maksymalnie da się obliczyć silnię dla 20 (20!=2432902008176640000, max dla __int64 to 9223372036854775807)

Cyfrowy Baron napisał(a):Tutaj masz błąd:

W funkcji silnia argument jest typu __int64, nastąpi konwersja int -> __int64. Gdzie jest błąd?
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
Podziękował : 1
Otrzymał podziękowań: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

Następna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 7 gości