• 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

0 głosów
234 wizyt
pytanie zadane 6 lipca 2016 w C i C++ przez pawel86g Nowicjusz (140 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 (42,560 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,380 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 (42,560 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,380 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,980 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,440 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ź 175 wizyt
0 głosów
1 odpowiedź 139 wizyt
Porady nie od parady
Publikując kody źródłowe korzystaj ze specjalnego bloczku koloryzującego składnię (przycisk z napisem code w edytorze). Nie zapomnij o ustawieniu odpowiedniego języka z rozwijanego menu oraz czytelnym formatowaniu kodu.Przycisk code

66,503 zapytań

113,269 odpowiedzi

239,876 komentarzy

46,641 pasjonatów

Przeglądających: 259
Pasjonatów: 6 Gości: 253

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...