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

Pętla w C++ - błąd

0 głosów
316 wizyt
pytanie zadane 3 grudnia 2016 w C i C++ przez Evelek Nałogowiec (28,960 p.)

Mam taki kod:

#include <iostream>
using namespace std;

int main()
{
    double y=0.981;
    for(double x = 0.000; x<1; x+=0.001)
    {
        if(y == x)
        {
            cout << "Znaleziony" << endl;
        }
    }
    return 0;
}

Dlaczego nie zostaje spełniony warunek if(y == x) ? Przypuszczam, że jest problem z własnością liczb zmiennoprzecinkowych i ich rozwinięciem dziesiętnym...jak można to naprawić?

3 odpowiedzi

+1 głos
odpowiedź 3 grudnia 2016 przez unknown Nałogowiec (39,560 p.)
wybrane 3 grudnia 2016 przez Evelek
 
Najlepsza
Tak się nie porównuje liczb zmiennoprzecinkowych. https://noobtuts.com/cpp/compare-float-values
–1 głos
odpowiedź 3 grudnia 2016 przez Owczarek Niemiecki Obywatel (1,570 p.)
A jakbyś zamiast "x+=0.001" napisał "x=x+0.001"? Może to przez to?
komentarz 3 grudnia 2016 przez Evelek Nałogowiec (28,960 p.)
Nie, tu chodzi o to, że zapis dziesiętny liczby x to czasami np. 0.9810000000000000001 i ta niedokładność psuje wszystko.
–2 głosów
odpowiedź 3 grudnia 2016 przez playerony Pasjonat (15,200 p.)
edycja 4 grudnia 2016 przez playerony
#include <iostream>
using namespace std;

int main()
{
    double y = 0.982;
    for(double x = 0.000; x<1; x+=0.001)
    {
        cout << x << endl;

        if((float)y / (float)x == 1)
        {
            cout << "Znaleziony" << endl;
            break;
        }
    }
    return 0;
}

Czemu downvote za rozwiązanie ?

komentarz 3 grudnia 2016 przez Evelek Nałogowiec (28,960 p.)

No właśnie nie wiem kto ci dał. Rozwiązanie fajne ale nie wiem, czy w każdym przypadku poprawne. A dałeś do myślenia mi teraz, bo np. taki kod też mi zaczyna działać. :)

#include <iostream>
using namespace std;

int main()
{
    double tablica[5] = {1.2, 1.5, 1.7, 2.0, 2.5};
    cout << int(tablica[0]) << endl;
    return 0;
}

 

komentarz 3 grudnia 2016 przez unknown Nałogowiec (39,560 p.)
Porównywanie liczb zmiennoprzecinkowych za pomocą operatora == to proszenie się o kłopoty.

Podobne pytania

0 głosów
2 odpowiedzi 2,142 wizyt
pytanie zadane 1 marca 2016 w C i C++ przez adrian28 Użytkownik (540 p.)
0 głosów
3 odpowiedzi 1,249 wizyt
pytanie zadane 29 stycznia 2017 w Android, Swift, Symbian przez Piotrinformatyk Początkujący (340 p.)
0 głosów
1 odpowiedź 1,240 wizyt
pytanie zadane 22 marca 2020 w C i C++ przez Anahan89 Obywatel (1,320 p.)

93,729 zapytań

142,668 odpowiedzi

323,283 komentarzy

63,288 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...