Skocz do zawartości




Zdjęcie

deklaracja liczby w c++


  • Zaloguj się, aby dodać odpowiedź
13 odpowiedzi w tym temacie

#1 spider865

spider865

    1

  • Members
  • PipPipPip
  • 193 postów

Napisano 24 marzec 2007 - 11:58

witam
mam do zadeklarowania np. liczbe w takiej postaci 4294967296
próbowałem już zadeklarować ją w long long int , ale nie kompiluje się...
proszę o pomoc...

#2 K_O

K_O

    1

  • Members
  • PipPipPip
  • 165 postów

Napisano 24 marzec 2007 - 12:59

Po pierwsze to nie long logn int tylko long lonh.
Po drugie to w C++ nie ma long long.
Po trzecie do obslugi bardzo duzych liczb najlatwiej uzyc jakiejs biblioteki np tej:
http://gmplib.org/index.html

po czwarte pozdrawiam ;)

#3 Zoltar7

Zoltar7

    Doradca Programming

  • Members
  • PipPipPip
  • 5024 postów

Napisano 24 marzec 2007 - 13:45

Ta liczba zapisana szesnastkowo to 0x100000000, czyli dokładnie o 1 za dużo, aby przechować ją w zmiennej 32-bitowej, np. "unsigned long int" (w 32-bitowych kompilatorach). Jeśli nie chcesz używać dodatkowych bibliotek do obsługi dużych liczb (jak biblioteka, którą podał K_O), to masz dwie opcje.

1) Skorzystaj z 64-bitowego kompilatora C++, wtedy zwykły typ "long int" będzie wystarczająco duży, aby operować na tak dużych liczbach.

2) Jeśli nie chcesz zmieniać kompilatora, użyj zmiennoprzecinkowego typu "double", który bez utraty precyzji może przechowywać liczby całkowite maks. 52-bitowe. Spokojnie wystarczy to, aby zapisać w nim wspomnianą liczbę. Tu masz przykład programu, który powinien zadziałać we większości współczesnych kompilatorów C++. Zwracam uwagę na konieczność oznaczania dużych liczb z kropką i zerem na końcu, w przeciwnym razie 32-bitowy kompilator nie poradzi sobie z takimi liczbami. Przy wyświetlaniu liczby program pominie jednak kropkę i zero.


#include
using namespace std;

int main()
{
double zmienna = 4294967296.0;

cout.setf(ios::fixed, ios::floatfield); // wyświetlanie liczb bez wykładnika

cout << zmienna << endl;

return 0;
}

#4 Zoltar7

Zoltar7

    Doradca Programming

  • Members
  • PipPipPip
  • 5024 postów

Napisano 24 marzec 2007 - 13:57

Dodam jeszcze, że w odróżnieniu od wspomnianych bibliotek do obsługi dużych liczb, operowanie na zmiennych typu "double" jest niemal równie szybkie jak operowanie na zmiennych typu "int". Dodawanie, mnożenie, itd. zmiennych typu "double" wykonuje jedna instrukcja procesora (w bibliotekach dużych liczb takie proste operacje wykonywane są przez wiele instrukcji). Współczesne procesory są jednak tak szybkie, że musiałbyś wykonywać bardzo specyficzne algorytmy, żeby odczuć różnice w szybkości obliczeń między typem "double" a użyciem jednej z bibliotek dużych liczb. To tak na marginesie.

#5 K_O

K_O

    1

  • Members
  • PipPipPip
  • 165 postów

Napisano 24 marzec 2007 - 18:40

Wydaje mi sie, ze jednak szybciej bedzie uzyc biblioteki :)
GMP na ten przyklad jest optymalizowana jezeli chodzi o szybkosc obliczen i nie sadze, zeby dalo sie latwo samemu zrobic to szybciej(nie mowie, ze to nie mozliwe)
Zreszta, jak komus sie chce to moze zrobic eksperyment, GMP mozna sprawdzic 'onlajn':

http://gmplib.org/index.html#TRY

proponuje np 99999!

powodzenia i pozdrawiam serdecznie :)

#6 Zoltar7

Zoltar7

    Doradca Programming

  • Members
  • PipPipPip
  • 5024 postów

Napisano 24 marzec 2007 - 20:26

To źle Ci się wydaje. Kilkanaście lat temu, kiedy tzw. koprocesor arytmetyczny w pecetach nie był częścią procesora (wszystkie procesory do 80386 włącznie i i486 w wersji SX), pojedyncze instrukcje koprocesora (np. fadd, fmul, fdiv) musiały być emulowane przy użyciu mniej lub bardziej złożonych procedur. Wtedy używanie typu "double" wiązało się ze znacznym spadkiem szybkości obliczeń. Wszystkie współczesne procesory mają jednak zintegrowany i bardzo wydajny koprocesor. Przejrzałem te biblioteki i rzeczywiście są one nieźle zoptymalizowane. Jest nawet rozróżnienie na różne wersje procesora Pentium. Operacje arytmetyczne nadal wykonują jednak procedury, składające się (np. w przypadku dzielenia) z kilkudziesięciu instrukcji. Nie ma szansy, żeby były one szybsze od pojedynczej instrukcji "fdiv" koprocesora arytmetycznego. Jest oczywiście szansa, że używając jakiejś starej wersji kompilatora C++ sprzed kilkunastu lat (np. Borland C++) źle ustawisz parametry kompilacji i instrukcje koprocesora będą w programie niepotrzebnie emulowane. Nie zmienia to jednak faktu, że gdy poprawnie skompilujesz program, operacje wykonywane na zmiennych typu "double" będą zawsze szybsze od operacji wykonywanych na typach z biblioteki GMP. Zresztą nie szybkość jest podstawową zaletą bibliotek GMP tylko brak ograniczenia precyzji obliczeń (poza ograniczeniem wynikającym z dostępnej pamięci RAM). Typ "double" ma tylko 52 bity mantysy, więc obliczenia na liczbach większych od 2^52 będą siłą rzeczy przybliżone. W bibliotekach GMP takiego ograniczenia nie ma.

Jeśli Cię to interesuje, poczytaj sobie np. na temat algorytmu dzielenia binarnego. Kiedyś rozpisywałem się na ten temat na forum. Jeśli operujesz na liczbach większych niż 2^N, gdzie N to szerokość słowa procesora, proste operacje arytmetyczne na tych liczbach muszą składać się z wielu instrukcji procesora. Dla przykładu, żeby emulować 64-bitowe operacje arytmetyczne na 32-bitowym procesorze, za dodawanie i odejmowanie odpowiedzialne będą min. dwie instrukcje zamiast jednej, za mnożenie kilkanaście instrukcji zamiast jednej, a za dzielenie kilkadziesiąt lub nawet kilkaset instrukcji zamiast jednej (algorytm zakłada działanie w pętli). Żadna, nawet najlepsza optymalizacja tego nie zmieni.

#7 Rebus28

Rebus28

    Newbie

  • Members
  • Pip
  • 3 postów

Napisano 02 wrzesień 2013 - 12:15

Witam

Czy ktoś mógłby łopatologicznie tak jak tu:

http://cpp0x.pl/kurs...lamy-Allegro/64

napisać prosto i zwięźle jak w tej bibliotece gmp dodawać odejmować przechowywać mnożyć dzielić i pierwiastkować duże liczby.

jak ktoś wie to prosił bym o pomoc czy w tej bibliotece da się po pierwiastkowaniu dużej liczby odciąć (nie zaokrąglić) wszystko po przecinku potrzebowałbym czegoś takiego z góry dzięki będę chciał to napisać na linuksie ale żeby to zainstalować muszę mieć jakiś działający kodzik. 



#8 cpomoc

cpomoc

    1

  • Members
  • PipPip
  • 12 postów

Napisano 03 wrzesień 2013 - 19:50

Hej,

 

nawet na systemach 32-bitowych jesteś w stanie normalnie działać na liczbach 64bitowych,

Wbudowanych typ na widnows to: __int64, pod linuxem masz biblioteke  #include <inttypes.h> i typy  uint64_t i  int64_t.



#9 Rebus28

Rebus28

    Newbie

  • Members
  • Pip
  • 3 postów

Napisano 04 wrzesień 2013 - 11:34

:( ja potrzebuje duże liczby od 600 do 1500 cyfrowe albo kalkulator taki jak "Karen's Calculator" tylko żeby miał pierwiastkowanie



#10 13ty Smok

13ty Smok

    1

  • Moderators
  • 2317 postów

Napisano 05 wrzesień 2013 - 22:53

Realizujesz to dokładnie wg algorytmu który stosujesz do operacji matematycznych robiąc to na kartce.
Wbrew pozorom to latwizna.



#11 Rebus28

Rebus28

    Newbie

  • Members
  • Pip
  • 3 postów

Napisano 09 wrzesień 2013 - 14:02

czyli co mam zrobić już prawie napisałem ten program biorę np. 1 0 0 0 0 podnoszę pisemnie do kwadratu sprawdzam czy jest większa od liczby np przykładową mam 1 2 3 4 5 6 7 8 9 i jeśli jest mniejsza to zwiększam pierwszą cyfrę dopuki nie będzie większa potem zmniejszam ją o jeden i to samo robię z drugą cyfrą i tak aż dojdę do ostatniej cyfry to będzie najmniejsza liczba całkowita która podniesiona do kwadratu da mniejszą lub równą 1 2 3 4 5 6 7 8 9. taki zamysł ogólny czy coś prościej idzie zrobić    



#12 13ty Smok

13ty Smok

    1

  • Moderators
  • 2317 postów

Napisano 09 wrzesień 2013 - 22:33

http://marcinotorows...ie-na-papierze/



#13 reich

reich

    Newbie

  • Members
  • Pip
  • 9 postów

Napisano 21 październik 2014 - 00:08

Jak masz problem z C++ to warto się wspomuć jakimś kursem który pomoże Tobie zrozumieć te wszystkie zawiłości w programie. Chwila szukania i prosze bardzoz http://strefakursow....gramowanie.html

 masz tam dostępny kurs C++. Z tego co widzę te kursy stoją wysoko w rankingu, więc warto się im przyjżeć :)



#14 Boobbyy

Boobbyy

    1

  • Members
  • PipPipPip
  • 1631 postów

Napisano 21 październik 2014 - 19:23

Po roku czasu czekania na twoją radę to chyba dał sobie spokój. Jak mi sie podobaja takie posty ni z gruchy ni z pietruchy.

 

Tak na marginesie to to forum całkiem padło.

Jak masz problem z C++ to warto się wspomuć jakimś kursem który pomoże Tobie zrozumieć te wszystkie zawiłości w programie. Chwila szukania i prosze bardzoz http://strefakursow....gramowanie.html

 masz tam dostępny kurs C++. Z tego co widzę te kursy stoją wysoko w rankingu, więc warto się im przyjżeć :)






Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych


Pozycjonowanie strony: Virtual Development