Dlaczego dokładne porównanie liczb zmiennoprzecinkowych czasem działa, a czasem nie?

0

Witam, jestem w trakcie nauki c++ jednak natknąłem się na pewien problem którego nie jestem w stanie ruszyć, jeżeli można to proszę o wyjaśnienie:

#include "stdafx.h"
#include "std_lib_facilities.h"
int main()
{
    cout << "Enter 2 numbers:\n";
    vector<double> numbers;
    double number1= 0;
    double number2 = 0;
    double minus;
    int i;
    while (cin >> number1 >> number2)
    {
        minus = number1 - number2;
        cout << minus;
        if (minus >= -0.01 && minus <= 0.01)
            cout << "These numbers are almost equal\n";
        else
            if (number1 < number2)
                cout << "Higher number is " << number2 << " and lower is " << number1 << '\n';
            else if (number1 > number2)
                cout << "Higher number is " << number1 << " and lower is " << number2 << '\n';
            else if (number1 == number2)
                cout << "First number is " << number1 << " and equals the second " << number2 << '\n';

    }

    keep_window_open();
    return 0;

W niektórych przypadkach działa w niektórych nie. Nie mam pojęcia co jest źle...
screenshot-20180804211842.png

0

Bardzo nam przykro, że masz problem. Masz może ochotę opisać, na czym ten problem polega?

https://dsp.krzaq.cc/post/445/jak-zadawac-pytania-na-forum/

0

Przy niektórych wartościach kod działa poprawnie czyli gdy różnica pomiędzy tymi liczbami jest na tyle mała, że można je uznać za prawie równe powinna odpowiadać "These numbers are almost equal" . Dzieje się tak w większości przypadków jednak przy niektórych liczbach np 24.24 i 24.25 warunek ten jest uznawany za niespełniony. Widać to na zamieszczonym screenshocie.

4

Liczby zmiennoprzecinkowe nie gwarantują w pełni dokładnych wyników (poza bardzo konkretnymi warunkami), o czym właśnie się przekonałeś.

Lektury:
http://kaczus.ppa.pl/art/Skrzynia_porad,18.html#double
http://kaczus.ppa.pl/art/liczbyzmiennoprzecinkowe,19.html

0

Dzięki za pomoc ! Problem rozwiązany.

0
kq napisał(a):

Liczby zmiennoprzecinkowe nie gwarantują w pełni dokładnych wyników (poza bardzo konkretnymi warunkami), o czym właśnie się przekonałeś.

Ograniczona dokładność zmiennego przecinka jest względnie znana, jak ktoś miał porządne miernictwo czy metody numeryczne to zna koncepję błędu liczbowego.
Mniej znane, a można się wyłożyć, to problem reprezentacji. Nie każda liczba istnieje. Nawet jeśli w źródle występuje stała i obliczenia podczas wykonania nie zachodzą.
double x = 12.3456;
zbadanie tego dobrym debuggerem pokaże 12.345600003 albo 12.345599998 (liczby wzięte z głowy). Wewnętrzna konstrukcja jest binarna, nasz świat jest dziesiętny itd...

Dodatkowym problemem jest, producenci środowisk sobie ubzdurali, że debugger będzie lepszy, jak będzie pokazywał "przyjazne" liczby a nie jakieś tasiemce (miał/ma to MSVC++)

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0