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

Visual Studio C++ - Zmienna long double - kod na wyznaczanie ostatniego wyrazu Ciągu Fibonacciego

VPS Starter Arubacloud
0 głosów
687 wizyt
pytanie zadane 6 lipca 2016 w C i C++ przez pawel86g Nowicjusz (160 p.)
Witam,  podczas tworzenia kodu w Codeblocks ostatni wyraz ciągu wyznacza 23601 później zwraca "inf" jako nieskończoność bo więcej już typ nie pomieści, natomiast w Visual Studio C++ używając tej samej tablicy zmiennych typu long double zwraca nieskończoność "inf" już przy wyznaczaniu 2000 wyrazu ciągu. Dlaczego taka różnica w VS C++ mimo jednego kodu i od czego to zależy?

4 odpowiedzi

0 głosów
odpowiedź 6 lipca 2016 przez Sebastian Fojcik Nałogowiec (43,020 p.)

Tutaj możesz zobaczyć zakresy zmiennych w Visual Studio.

https://msdn.microsoft.com/pl-pl/library/s3f49ktz.aspx

Znajdź w tabeli double oraz long double. Tam jest wyraźnie napisane, że long double mieści taką samą liczbę co double. Zajmuje tyle samo miejsca w pamięci i jest (teoretycznie) dokładnie tą samą zmienną, tym samym typem. I to wyjaśnia dlaczego tylko tyle wyrazów ciągu możesz policzyć.

Tutaj możesz się dowiedzieć dlaczego tak jest:
http://stackoverflow.com/questions/7120710/why-did-microsoft-abandon-long-double-data-type

Oczywiście wszystko wina upartego Microsoftu chcącego kompatybilności :/
Polecam również poczytać więcej o tym, choć pojęcia nie są najłatwiejsze.

Pozdrawiam.

0 głosów
odpowiedź 6 lipca 2016 przez MetGang Nałogowiec (34,360 p.)
https://msdn.microsoft.com/pl-pl/library/s3f49ktz.aspx

Wg tego long double w VS C++ ma rozmiar taki sam jak zwykły double czyli 8 bajtów. Natomiast w GCC long double ma długość 12 bajtów.

Zresztą lepiej użyć unsigned long long (int 64 bitowy), gdyż ciąg Fibonaciego nie posiada liczb po przecinku.
komentarz 6 lipca 2016 przez Sebastian Fojcik Nałogowiec (43,020 p.)

unsigned long long int zmieści maksymalnie 18,446,744,073,709,551,615. Liczba zmiennoprzecinkowa jest czymś zupełnie innym. Zmienna typu double przechowa liczbę, która składa się z 309 cyfr i mówi o tym zamieszczona przez Ciebie tabelka. Podany wyżej int mieści "raptem" 20 cyfr. Czymże to jest w obliczu doubla? :-D

Po przekroczeniu tej liczby 309 cyfr zostanie wypisane "inf". Natomiast po przekroczeniu liczby 18,446,744,073,709,551,615 w przypadku unsigned long long int będzie tam (zapewne) wartość 0.

Typ całkowity służy do nieco innych rzeczy (jest przy tym absolutnie precyzyjny, nie to co zmiennoprzecinkowe typy).

1
komentarz 7 lipca 2016 przez MetGang Nałogowiec (34,360 p.)
Rzeczywiście mój błąd. Zapomniałem, że liczby zmiennoprzecinkowe używają notacji naukowej :p
0 głosów
odpowiedź 31 grudnia 2018 przez tomasz_olechnowicz Nowicjusz (200 p.)
Mam podobny problem co kolega (również używam VS 2017). Dopiero zaczynam naukę C++, ale coś mi nie wychodzi właśnie z ciągiem Fibonacciego.

Przy użyciu long double największy kolejny wyraz ciągu, jaki udaje mi się uzyskać to 1476. Każdy kolejny to już nieskończoność (inf). Czy jest jakiś sposób, aby zmusić program, żeby później pokazywał inf-a?

Sprawdzałem ile wynosi u mnie pojemność long double i jest podobnie jak u innych w VS czyli 8 Bajtów.

Największa liczba uzyskana poleceniem "numeric_limits<long double>::max()" to 1.79769e+308, czyli faktycznie 1477 wyraz by ją przekroczył.

Z góry dziękuje za podpowiedzi
komentarz 31 grudnia 2018 przez monika90 Pasjonat (22,940 p.)
Za pomocą liczb podwójnej precyzji możesz obliczyć co najwyżej 78 wyraz ciągu, a za pomocą rozszerzonej precyzji 93. Więcej się nie da takimi prostymi metodami.
–1 głos
odpowiedź 6 lipca 2016 przez CzikaCarry Szeryf (75,340 p.)
Ograniczenia pojemności zmiennych są narzucane przez bibliotekę główną (iostream). Jest to kwestia umowy. Może ivs korzysta z innej biblioteki / wersji biblioteki (w co wątpię). Nie wiadomo co mogło się wydarzyć, szukajcie debuggerem 2000 razy bledu w pętli a znajdziecie :D

Podobne pytania

+1 głos
1 odpowiedź 1,048 wizyt
pytanie zadane 25 września 2016 w C# przez JanuszSTW Początkujący (480 p.)
0 głosów
1 odpowiedź 627 wizyt

92,453 zapytań

141,262 odpowiedzi

319,086 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...