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