Double nieprecyzyjny?

0

Program ma wydrukować tekst "Liczby są prawie równe.", jeśli różnią się o mniej niż 1/100.

int main()
{
	system("chcp 1250");
	double val1;
	double val2;

	while (cin >> val1 >> val2)
	{
		if (val1 == val2)
			cout << "Liczby są równe." << endl;
		else if (val1 > val2) {
			cout << "Mniejsza z liczb to: " << val2 << "\nWiększa z liczb to: " << val1 << endl;
			if (val1 - val2 < 1.0 / 100) cout << "Liczby są prawie równe." << endl;
		}
		else {
			cout << "Mniejsza z liczb to: " << val1 << "\nWiększa z liczb to: " << val2 << endl;
			if (val2 - val1 < 1.0 / 100) cout << "Liczby są prawie równe." << endl;
		}
	}

	return 0;
}

Jednak po wprowadzeniu liczb 7 i 7.01 program wyświetla komunikat "Liczby są prawie równe." mimo ze różnica nie jest mniejsza od 1/100.

Czy ktoś może mi wytłumaczyć jak to działa oraz jak rozwiązać ten problem?

Przepraszam za błędy i złe formatowanie jest to mój pierwszy post + godzina późna.

3

0.1 jest okresowym ułamkiem binarnym więc generalnie będzie dawać nieprecyzyjne wyniki w jedną albo drugą stronę. Pomyśl o nim jak o 1/3 w zapisie dziesiętnym i o próbie porównywania tego z jakimś 0,33333333 i 0,33333334 ;]

0

Więc można jakoś poprawić ten program? Jak sobie radzić w takich przypadkach? Czy może na aktualnym moim poziomie takie rozwiązanie jest ok?

0

To zależy, z doublami nic tu nie zrobisz. W prawdziwym życiu takie problemy, występujące na przykład przy obliczeniach związanych z pieniędzmi, rozwiązuje się operacjami na typach całkowitych. Tzn jeśli w banku masz 100,01 zł to w rzeczywistości bank nie trzyma tej wartości jako double tylko jako specjalny typ oparty o liczby całkowite. Możesz sobie to wyobrazić jako trzymanie wartości tam 10001 i tylko przy wypisywaniu ustawia się przecinek w odpowiednim miejscu.

0

W ogólności, komputer działający na liczbach rzeczywistych (a nie przybliżający je w jakiś sposób) jest niemożliwy do zbudowania w naszym Wszechświecie: https://en.wikipedia.org/wiki/Real_computation

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