• 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 ???

VPS Starter Arubacloud
+1 głos
324 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,340 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 271 wizyt
pytanie zadane 25 czerwca 2022 w C i C++ przez polandonion Mądrala (6,970 p.)
+1 głos
1 odpowiedź 311 wizyt
pytanie zadane 30 września 2021 w JavaScript przez Doge Gaduła (3,320 p.)
0 głosów
0 odpowiedzi 144 wizyt

92,453 zapytań

141,262 odpowiedzi

319,086 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...