[C++] Oblicz wyraz ciągu

agnieszka043
Użytkownik
Użytkownik
Posty: 15
Rejestracja: 15 gru 2019, o 20:24
Płeć: Kobieta
wiek: 19

[C++] Oblicz wyraz ciągu

Post autor: agnieszka043 »

ZAD: Napisać program wczytujący liczbę naturalną \(\displaystyle{ n}\). Należy obliczyć \(\displaystyle{ n}\)-ty wyraz ciągu zadanego
wzorem \(\displaystyle{ a_n = 3\cdot (-1)^n \cdot 2^{n+1}}\) i wypisać wynik na ekranie.
Problem pierwszy to uzyc komendy int czy double? bo naturalna jest i rzeczywistą i całkowitą, więc tu sie gubie. Drugi problem to wyczytałam że nie ma mozliwosci w c++ uzyc indeksu dolnego.. a więc jak zapisać ciąg \(\displaystyle{ a_n}\)?
Ostatnio zmieniony 26 lut 2020, o 14:17 przez Afish, łącznie zmieniany 2 razy.
Powód: Poprawa wiadomości.
Dudenzz
Użytkownik
Użytkownik
Posty: 93
Rejestracja: 8 mar 2009, o 18:21
Płeć: Mężczyzna
Pomógł: 19 razy

Re: [C++] Oblicz wyraz ciągu

Post autor: Dudenzz »

Ani int, ani double nie jest komendą - są to typy. Powinnaś użyć typu, który najlepiej reprezentuje opisywaną przez ciebie operację. Zastanów się - czy gdzieś w twojej operacji będzie potrzebna liczba rzeczywista, czy liczby całkowite wystarczą? Jeżeli przecinek będzie niezbędnny - użyj float albo double, a jeżeli liczby całkowite wystarczą użyj int.

Co do drugiego problemu - co masz na myśli mówiąc "indeks dolny"? Przecież C++ to nie jest język zapisu równań matematycznych, tylko język programowania. Zdefiniuj zmienną, która będzie odpowiednikiem \(\displaystyle{ a_n}\) i nazwij ją jak chcesz (no prawie jak chcesz, nie możesz jej nazwać z indeksem dolnym - ale co z tego?).
Awatar użytkownika
Dasio11
Moderator
Moderator
Posty: 10225
Rejestracja: 21 kwie 2009, o 19:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 40 razy
Pomógł: 2362 razy

Re: [C++] Oblicz wyraz ciągu

Post autor: Dasio11 »

Dudenzz pisze: 27 lut 2020, o 15:01Zastanów się - czy gdzieś w twojej operacji będzie potrzebna liczba rzeczywista, czy liczby całkowite wystarczą? Jeżeli przecinek będzie niezbędnny - użyj float albo double, a jeżeli liczby całkowite wystarczą użyj int.
Akurat w tym wypadku lepszy jest float, ale nie ze względu na możliwość reprezentowania liczb niecałkowitych, lecz na zakres przyjmowanych wartości: int zadziała tylko dla \(\displaystyle{ n \le 28}\), podczas gdy float poradzi sobie gdy \(\displaystyle{ n \le 125}\).
Dudenzz
Użytkownik
Użytkownik
Posty: 93
Rejestracja: 8 mar 2009, o 18:21
Płeć: Mężczyzna
Pomógł: 19 razy

Re: [C++] Oblicz wyraz ciągu

Post autor: Dudenzz »

Zastanawiałeś się kiedyś jak to jest, że float, może przyjmować wartości niecałkowite, zajmuje cztery bajty (tyle samo co int) i ma zakres nieporównywalnie większy niż int? Otóż precyzja nie dotyczy ilości cyfr "po przecinku", a precyzji jako takiej. Precyzja nie jest stała, jest ona funkcją samej liczby - duże liczby są mało precyzyjne, podczas gdy liczby małe są bardzo precyzyjne. Wynika to z natury reprezentacji liczb rzeczywistych - takie liczby są reprezentowane jako zmiennoprzecinkowe. Innymi słowy podstawowa metoda zapisu takiej liczby wykorzystuje mnożenie i potęgowanie, liczby nie są zapisywane per se. W przypadku int mowy o precyzji nie ma, każda liczba jest zapisana w pełni precyzyjnie. float, jak można się domyślić bardzo szybko staje się nieprecyzyjny. Jeżeli chcesz poświęcić precyzję na rzecz większego zakresu - użyj float, precyzyjny wynik uzyskasz za pomocą int.

Edit. Pomyślałem, że może Ci chodzić o to, że wyraz zadanego ciągu przypomina liczbę zmiennoprzecinkową, dlatego float mógłby reprezentować liczby dość precyzyjnie w większym zakresie. Okazuje się, że tak jest, ale liczby są reprezentowane precyzyjnie nie w całym zakresie, ale do \(\displaystyle{ n=57}\), czyli faktycznie jest to zakres większy niż int.
Awatar użytkownika
Dasio11
Moderator
Moderator
Posty: 10225
Rejestracja: 21 kwie 2009, o 19:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 40 razy
Pomógł: 2362 razy

Re: [C++] Oblicz wyraz ciągu

Post autor: Dasio11 »

Dudenzz pisze: 27 lut 2020, o 23:46Pomyślałem, że może Ci chodzić o to, że wyraz zadanego ciągu przypomina liczbę zmiennoprzecinkową, dlatego float mógłby reprezentować liczby dość precyzyjnie w większym zakresie. Okazuje się, że tak jest, ale liczby są reprezentowane precyzyjnie nie w całym zakresie, ale do \(\displaystyle{ n=57}\), czyli faktycznie jest to zakres większy niż int.
Słusznie pomyślałeś, ale odnośnie zakresu nie masz racji, bo liczba \(\displaystyle{ a_{125} = (-1) \cdot 1{,}1_{(2)} \cdot 2^{127}}\) ma dokładną reprezentację w typie

Kod: Zaznacz cały

https://pl.wikipedia.org/wiki/IEEE_754
i jest nią \(\displaystyle{ \textcolor{red}{1}\textcolor{orange}{11111110}\textcolor{green}{10000000000000000000000}}\).
agnieszka043
Użytkownik
Użytkownik
Posty: 15
Rejestracja: 15 gru 2019, o 20:24
Płeć: Kobieta
wiek: 19

Re: [C++] Oblicz wyraz ciągu

Post autor: agnieszka043 »

czyli float czy int?
Awatar użytkownika
Dasio11
Moderator
Moderator
Posty: 10225
Rejestracja: 21 kwie 2009, o 19:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 40 razy
Pomógł: 2362 razy

Re: [C++] Oblicz wyraz ciągu

Post autor: Dasio11 »

Jeśli wejściowe \(\displaystyle{ n}\) może przyjmować wartości większe niż \(\displaystyle{ 28}\), to lepszy będzie float. W przeciwnym razie możesz użyć inta (i nawet jest to delikatnie lepszy wybór ze względu na dokładność, z jaką liczba jest wypisywana na ekran).
ODPOWIEDZ