• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z dużymi liczbami w Visual Studio

Object Storage Arubacloud
0 głosów
280 wizyt
pytanie zadane 1 maja 2017 w C i C++ przez kubekzone Użytkownik (620 p.)

Witam,

Przerabiam 5 odcinek z kursu C++, kompiluję w Visual Studio 2017 i problem polega na tym, że VS nie radzi sobie z dużymi liczbami (screen poniżej). Wyświetla nieskończoność już przy 1477 wyrazie ciągu Fibonacciego. W Code::Blocks ten sam kod śmiga bez problemów.

Czemu tak / jak temu zaradzić? :D

Podsyłam jeszcze cały kod:

#include <iostream>
#include <iomanip>
using namespace std;

long double fib[100000]; int n;

int main()
{
	cout << "Ile liczb Fibonacciego mam wyznaczyc: ";
	cin >> n;

	fib[0] = 1;
	fib[1] = 1;

	for (int i = 2; i<n; i++)
	{
		fib[i] = fib[i - 1] + fib[i - 2];
	}

	cout << setprecision(10000);

	for (int i=0; i<n; i++)
	{
	    cout<<endl<<"wyraz nr"<<i+1<<": "<<fib[i];
	}

	return 0;
}

 

3 odpowiedzi

+2 głosów
odpowiedź 1 maja 2017 przez adrian17 Ekspert (344,860 p.)
W MSVC, long double zachowuje się jak double.

Natomiast i tak nie powinieneś używać do tego liczb zmiennoprzecinkowych - przy dużych wartościach tracą one precyzję, przez co zaczniesz dostawać niepoprawne wyniki.
komentarz 1 maja 2017 przez kubekzone Użytkownik (620 p.)
No dobra, w takim razie jak żyć? Da się coś zrobić żeby MSVC był w stanie operować na tak dużych wartościach?
komentarz 1 maja 2017 przez adrian17 Ekspert (344,860 p.)
Z tego co wiem, to nie.

Podtrzymuję, że najlepszym rozwiązaniem byłoby zarzucenie liczb zmiennoprzecinkowych i w zamian użycia jakiejś biblioteki do liczb o nieograniczonym rozmiarze.
komentarz 1 maja 2017 przez CzikaCarry Szeryf (75,340 p.)
Albo napisanie własnego typu, nie jest to przecież tak trudne...
komentarz 1 maja 2017 przez adrian17 Ekspert (344,860 p.)
Dodawanie i odejmowanie jeszcze, ale mnożenie i dzielenie? Wydajnie?

Po to są znane i sprawdzone biblioteki by z nich korzystać.
komentarz 1 maja 2017 przez CzikaCarry Szeryf (75,340 p.)
Zawsze to można się czegoś nauczyć, wlaszcza będąc osobą początkującą, poduczyć się assemblera :)
komentarz 1 maja 2017 przez mokrowski Mędrzec (155,460 p.)
Proszę o adres repozytorium z typem który ostatnio napisałeś. Było by fajnie by uwzględniał sensowne konwersje, wyświetlanie na standardowych strumieniach, konwersje do hex/dec/oct, pełen zestaw operacji matematycznych i logicznych, może przesunięcia bitowe także... Eh...
komentarz 1 maja 2017 przez CzikaCarry Szeryf (75,340 p.)

Jeśli odkopię, to mogę wrzucić kod mojego BigInta napisanego ~2  lata temu, na początku mojej przygody z programowaniem (był mi potrzebny do jednego z zadań ze SPOJ'a), obsługiwał tylko podstawowe operacje matematyczne. Po drodze miałem format komputera, ale jak znajdę, to wrzucę kod na gitHuba.

konwersje do hex/dec/oct,

W tym przypadku jest bez znaczenia jaki to typ, bo jeśli liczby są całkowite i dodatnie, to konwertuje się je do innych systemów liczbowych w ten sam sposób. Poza tym i tak, te dane są przechowywane w systemie dwójkowym.

Obecnie działam głównie w dwóch językach: PHP i C#. Obydwa te języki "królami wydajności" nie są, a poza tym nie piszę w nich żadnych aplikacji wymagających jakichś super obliczeń, więc nie muszą być specjalnie szybkie (nawet czasami specjalnie "sabotuję system logowania, aby wykonywał się te 200ms dłużej, aby bruteforce nie był tak skuteczny. Zawsze dodaję jeszcze cooldown na IP za 5 nieudanych prób zalogowania). Nawet jakby mi się chciało to optymalizować, to jedno zapytanie do bazy danych, i całe 5ms oszczędzone dzięki optymalizacji pójdzie w niepamięć.

+2 głosów
odpowiedź 1 maja 2017 przez mokrowski Mędrzec (155,460 p.)
edycja 1 maja 2017 przez mokrowski
Użyj biblioteki GMP. Tu masz informacje jak: https://pl.wikibooks.org/wiki/Programowanie_w_systemie_UNIX/GMP

Wprawdzie dla GNU/Linux/Unix, ale po zainstalowaniu pakietu w MS Windows program jest taki sam.

Inną taką biblioteką jest MPIR: http://mpir.org/

Ta druga jest nieco szybsza ale radził bym zacząć od 1 :-)

PS. No tak.. a o boost zapomniałem... http://www.boost.org/doc/libs/1_53_0/libs/multiprecision/doc/html/index.html :)
+1 głos
odpowiedź 1 maja 2017 przez obl Maniak (51,280 p.)
A koniecznie to musisz robić w C++? Pytam bo w Pythonie bez zbędnych ceregieli na dzień dobry masz obsługę bardzo dużych liczb całkowitych. Nie trzeba używać żadnych dodatkowych bibliotek.
komentarz 1 maja 2017 przez kubekzone Użytkownik (620 p.)
Program nie jest tutaj tak bardzo istotny, po prostu zaczynam naukę w C++ i interesowało mnie czemu na różnych kompilatorach kod działa inaczej.

Podobne pytania

0 głosów
1 odpowiedź 1,236 wizyt
pytanie zadane 9 kwietnia 2017 w C i C++ przez maciek259 Nowicjusz (240 p.)
0 głosów
2 odpowiedzi 890 wizyt
pytanie zadane 9 maja 2018 w C i C++ przez koniak20 Początkujący (390 p.)
0 głosów
3 odpowiedzi 1,950 wizyt
pytanie zadane 28 marca 2017 w C i C++ przez Kenzy Obywatel (1,160 p.)

92,572 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...