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

question-closed Czemu ta instrukcja warunkowa nie działa ???

+1 głos
898 wizyt
pytanie zadane 9 czerwca 2019 w C i C++ przez SCpl Użytkownik (590 p.)
zamknięte 2 lipca 2020 przez SCpl

Nie mam pojęcia czemu ta instrukcja warunkowa nie działa. Po odpaleniu programu na ekranie wyświetla się

ERROR
5.999

zamiast

Hej!!!
5.999

#include <iostream>
using namespace std;
float liczba=5.999;
int main()
{
    if (liczba==5.999)
    {
        cout << "Hej!!!" << endl << liczba << endl;
    }
    else
    {
        cout << "ERROR" << endl << liczba << endl;
    }
    return 0;
}

komentarz zamknięcia: Już wszystko wiem. :D

1 odpowiedź

+1 głos
odpowiedź 9 czerwca 2019 przez Eryk Andrzejewski Mędrzec (164,260 p.)
wybrane 9 czerwca 2019 przez SCpl
 
Najlepsza

Do porównywania zmiennych typu float nie należy stosować operatora porównania, ze względu na to jak te zmienne są przechowywane w pamięci i wynikającą z tego niedokładność.

Sprawdzić to możesz dzięki takiej konstrukcji:

if (fabs(a - b) < epsilon)

gdzie a i b to zmienne typu float, a epsilon to pewna bardzo mała liczba. Użycie funkcji fabs() upewnia Cię, że wynik będzie nieujemny - wyrażenie fabs(a - b) możesz potraktować jako odjęcie mniejszej liczby od większej.

Tak dla ścisłości - to nie jest funkcja warunkowe, a instrukcja warunkowa - funkcja to zupełnie inny element w oprogramowaniu. smiley

komentarz 9 czerwca 2019 przez SCpl Użytkownik (590 p.)
Proszę, podaj przykład, aby wyświetliło się Hej 6, bo nie rozumiem.
Czy potrzebna jest do tego jakaś dodatkowa biblioteka ???
komentarz 9 czerwca 2019 przez Eryk Andrzejewski Mędrzec (164,260 p.)

Możesz skorzystać sobie z takiej funkcji areAlmostEqual():

#include <iostream>
#include <cmath>
#include <limits>

bool areAlmostEqual(float a, float b)
{
    return fabs(a - b) < std::numeric_limits<double>::epsilon();
}

int main()
{
    if (areAlmostEqual(5.99, 5.99))
    {
        std::cout << "Są równe!\n";
    }
}

Powinno zadziałać, choć nie testowałem. wink

komentarz 9 czerwca 2019 przez SCpl Użytkownik (590 p.)

Dzięki działa tylko musiałem z

std::cout << "Sąrówne!/n":

usunąć polskie znaki.

1
komentarz 9 czerwca 2019 przez Patrycjerz Mędrzec (192,320 p.)

Do porównywania zmiennych typu float nie należy stosować operatora porównania (...)

Oczywiście, że można. Kolega popełnił po prostu podstawowy błąd porównywania wartości o różnych typach.

Zmienna `liczba` jest typu float, zaś literał `5.999` jest typu double. Wartości zmiennoprzecinkowe mają pewną dokładność (wg standardu IEEE-754), która nie wystarcza do prezentacji wszystkich liczb dziesiętnych. Typ float ma tę dokładność mniejszą, double natomiast większą. Niestety oba typy nie zmieszczą w sobie wartości 5.999, która musi być przez kompilator kodowana do jej niedokładnej reprezentacji binarnej. Natomiast można porównywać te same niedokładne reprezentacje, gdy są tego samego typu, wtedy ten warunek zwróci prawdę.

double liczba = 5.999;
if (liczba == 5.999) // te same typy, czyli wartości są sobie równe
{
    std::cout << "Hej!!!" << std::endl << liczba << std::endl;
}

Można oczywiście użyć typu float i literału `5.999f`.

Podobne pytania

0 głosów
2 odpowiedzi 661 wizyt
pytanie zadane 25 czerwca 2022 w C i C++ przez polandonion Dyskutant (7,730 p.)
+1 głos
1 odpowiedź 891 wizyt
pytanie zadane 30 września 2021 w JavaScript przez Doge Gaduła (3,420 p.)
0 głosów
0 odpowiedzi 236 wizyt

93,800 zapytań

142,768 odpowiedzi

323,461 komentarzy

63,420 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.

...