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

C++ pętla while - problem ze sprawdzeniem prawdziwości warunku

Object Storage Arubacloud
+1 głos
430 wizyt
pytanie zadane 28 stycznia 2017 w C i C++ przez qlucha Obywatel (1,790 p.)
#include <iostream>
#include <windows.h>

using namespace std;

int main()
{
     float zmienna;
      int n=0;
      zmienna=5;

      cout<<zmienna<<endl;
      Sleep(2000);

      while(zmienna!=10)
    {
      n++;
      cout<<"iteracja petli nr."<<n<<endl;
      zmienna+=0.20;
      Sleep(1000);
      cout<<zmienna<<endl;
      cout<<"Wykonywalne Instrukcje w petli while"<<endl;
    }
    return 0;
}

Witam , kod służy do nauki i Wiem że można ten warunek zapisać inaczej .Ale po 3 krotnym sprawdzeniu że wartośći zmiennej w 25 iteracji pętli zostaje przypisana wartość zmienna=10 , nie zrywa mi pętli while(zmienna!=10)  tylko tworzy nieskończoną pętle i nie wiem dlaczego ?

2 odpowiedzi

+2 głosów
odpowiedź 28 stycznia 2017 przez niezalogowany
wybrane 28 stycznia 2017 przez qlucha
 
Najlepsza

Liczby zmiennoprzecinkowe mają swoją dokładność, która nie jest taka, jaką byś się spodziewał licząc dziesiętnie. One są zapisywane binarnie, więc nie każda liczba dziesiętna się przekłada na binarną i są wprowadzane zaokrąglenia. Dlatego nie wolno porównywać liczb zmiennoprzecinkowych poprzez znak == albo !=. W tym przypadku zmień na <10 i jak przekroczysz 10 (w tym także o troszkę), to wyłapie.

 

Żeby zobaczyć jak naprawdę zmienia ci się zmienna, daj taki zapis:

cout << setprecision(20) << zmienna << endl;

a wcześniej

#include <iomanip>

 

komentarz 28 stycznia 2017 przez qlucha Obywatel (1,790 p.)

Dzieki za  odpowiedz i Wszystko robi się jaśniejyeswink

0 głosów
odpowiedź 28 stycznia 2017 przez niezalogowany
Dodam jeszcze, że w pełni poprawnie matematycznie jest badanie czy wartość bezwzględna różnicy zmiennej i celu jest epsilonowo mała. Czyli załóżmy, że chcesz dojść do tego Twojego 10 z dokładnością do 0.001, to zapiszesz

| zmienna - 10 | < 0.001

Tylko nie zapomnij o wartości bezwzględnej, bo bez tego to nie zadziała. Możesz sobie sam napisać taką funkcję albo skorzystać z odziedziczonej po C (nagłówek cmath) funkcji abs()  (http://www.cplusplus.com/reference/cstdlib/abs/)

Tylko przy takim zapisie, jak przeskoczysz za daleko, więc np. do 10.50, to już nie wyłapie. Więc zależy to oczywiście od potrzeb.

Podobne pytania

0 głosów
1 odpowiedź 2,779 wizyt
pytanie zadane 10 kwietnia 2016 w C i C++ przez SlaVic Nowicjusz (170 p.)
0 głosów
3 odpowiedzi 868 wizyt
0 głosów
1 odpowiedź 242 wizyt
pytanie zadane 31 maja 2017 w PHP przez Amiga4ever Użytkownik (570 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 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!

...