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

Pętla while - przy większych wartościach zawiesza się

Object Storage Arubacloud
0 głosów
553 wizyt
pytanie zadane 18 czerwca 2019 w C i C++ przez Eryk Słowiński Początkujący (280 p.)

Przerabiając kurs C++ staram się dodać coś od siebie do każdego programu, aby lepiej utrwalić informacje. Więc do początkowego programu podliczającego rozmnażanie bakterii dodałem możliwość wprowadzenia przez użytkownika danych:

1. Ile wynosi populacja bakterii na początku.

2. Jaką populację chcesz osiągnąć.

3. W jakich odstępach czasowych bakterie się rozmnażają

Po wprowadzeniu danych program przeprowadza symulację i podaje wynik (razem ze słownym podsumowaniem). Kod wygląda tak: 

#include <iostream>

using namespace std;

int warunek; int populacja; int czas=0; int czestotliwosc;
int main()
{
    cout << "Ponizszy program stanowi symulacje rozmnazania bakterii. Bakterie rozmnazaja sie co jedna godzine." << endl;
    cout << "Podaj poczatkowa populacje bakterii:" ;
    cin >> populacja ;
    cout << "Ile bakterii chcesz aby populacja osiagnela:" ;
    cin >> warunek ;
    cout << "Jak czesto Twoje bakterie sie rozmnazaja (podaj w sekundach):" ;
    cin >> czestotliwosc;

    while (populacja<=warunek)
    {
    czas = czas+czestotliwosc ;
    populacja = populacja*2 ;
    cout << "Minelo " << czas << " sekund. Populacja bakterii wynosi: " << populacja << "." << endl;
    }
    cout << "Bakterie osiagna zadana przez Ciebie populacje po " << czas << " sekundach." << endl;
    return 0;
}

Program działa tak jak powinien, do momentu w którym podaje jakieś ogromne wartości (np populacja>10mld) i wtedy się zawiesza.Wyświetla wartości ujemne a potem pętla leci w nieskończoność z wynikiem 0. Zastanawiam się czy nie chodzi po prostu o możliwości obliczeniowe komputera, ale z drugiej strony podejrzane wydaje mi się żeby komputer nie poradził sobie z działaniem 1mld*1mld. Jeśli to wina kodu to dajcie proszę znać co mogę poprawić.

 

komentarz 18 czerwca 2019 przez niezalogowany
edycja 18 czerwca 2019
https://pl.wikipedia.org/wiki/Liczba_ca%C5%82kowita_(typ_danych)

każdy pojemnik ma swoja objętość (tu długość)

Przyszła mi do głowy taka analogia, że jak chcesz zrobić 1 L w szklance na stole, to niema siły by nie rozlać. O ile ze stołu można pozbierać (przestrzeń twojego programu), ale nikt tego nie robi. To jak poleci dalej to zniszczy dywan (dane twojego kompa).

2 odpowiedzi

+2 głosów
odpowiedź 18 czerwca 2019 przez Bondrusiek Maniak (61,370 p.)
wybrane 18 czerwca 2019 przez Eryk Słowiński
 
Najlepsza

Witam,

wydaje mi się że typ int nie poradzi sobie z tak dużymi danymi. 10^9 * 10^9 = 10^18 to dużo więcej niż może obsłużyć typ int. Tutaj możesz zobaczyć jaką wartość może przechować int dla Twojego kompilatora

https://www.oreilly.com/library/view/c-cookbook/0596007612/ch03s08.html

Przykład Windows XP using Visual C++ 7.1:

short: min: -32768 max: 32767 int: min: -2147483648 max: 2147483647 long: min: -2147483648 max: 2147483647 float: min: 1.17549e-038 max: 3.40282e+038 double: min: 2.22507e-308 max: 1.79769e+308 long double: min: 2.22507e-308 max: 1.79769e+308 unsigned short: min: 0 max: 65535 unsigned int: min: 0 max: 4294967295 unsigned long: ...

Polecam zwiększyć typ tak aby można było obsłużyć chcianą wartość np. float czy double. Tu możesz zobaczyć przykładowe wartości zakresów

https://www.tutorialspoint.com/cplusplus/cpp_data_types.htm

komentarz 18 czerwca 2019 przez Eryk Słowiński Początkujący (280 p.)
Ok, rozumiem. A czy używanie typów np. float czy innych obsługujących większe wartości wiąże się z jakimiś konsekwencjami? Np. dłuższy czas wykonywania operacji itd.?
komentarz 18 czerwca 2019 przez Bondrusiek Maniak (61,370 p.)
Tak, w linku tutorialspoint jest tabela z typami danych oraz ich wielkością w bajtach( Typical Bit Width ). Typy z możliwą większą dokładnością bądź wielkością mają naturalnie zwiększoną szerokość aby móc to przechować. Oczywiście wpływa to na czas wykonania operacji oraz rozmiar programu ale jest to na tyle mała że nie powinieneś się tym przejmować. Przy stosowaniu takich typów powinieneś rozróżnić 3 rodzaje: przy potrzebie przechowania liczb całkowitych stosuj int(z short bądź long wedle potrzeby), przy liczby ułamkowych stosuj float natomiast jeśli się liczy wielkość oraz dokładność to używaj typu double, który może być wykorzystywany do obliczenie fizyki kwantowej gdzie wielkości są bardzo małe bądź w astronomii gdzie należy przechowywać bardzo duże wartości.
0 głosów
odpowiedź 18 czerwca 2019 przez mrspock1 Mądrala (6,420 p.)
Na zmienną sterującą dla tak dużych wartości powinieneś używać typu danych całkowitych int64. Float nie będzie dobrze działał jako licznik pętli.

Podobne pytania

0 głosów
1 odpowiedź 440 wizyt
pytanie zadane 9 listopada 2016 w C# przez Alex.Ironside Stary wyjadacz (14,900 p.)
0 głosów
1 odpowiedź 688 wizyt
pytanie zadane 6 stycznia 2019 w C i C++ przez Kacper Lasota Początkujący (250 p.)
0 głosów
2 odpowiedzi 587 wizyt
pytanie zadane 4 października 2018 w C i C++ przez jarekmarek Nowicjusz (120 p.)

92,576 zapytań

141,426 odpowiedzi

319,650 komentarzy

61,961 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!

...