• 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

Object Storage Arubacloud
0 głosów
139 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,240 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 1,562 wizyt
pytanie zadane 1 marca 2016 w C i C++ przez adrian28 Użytkownik (540 p.)
0 głosów
3 odpowiedzi 577 wizyt
pytanie zadane 29 stycznia 2017 w Android, Swift, Symbian przez Piotrinformatyk Początkujący (340 p.)
0 głosów
1 odpowiedź 912 wizyt
pytanie zadane 22 marca 2020 w C i C++ przez Anahan89 Obywatel (1,320 p.)

92,568 zapytań

141,422 odpowiedzi

319,642 komentarzy

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

...