@adygha

Почему 0.2f + 0.3f == 0.5f?

Проблему хранения дробных чисел в памяти компьютера в двоичном виде я уже знаю, т.е. почему не выполняется равенство 0.1 + 0.2 == 0.3 мне понятно.

Но мне не понятно почему равенство 0.2f + 0.3f == 0.5f верное.
Набросал такой код:
cout << setprecision(64)
		<< "0.3 = " << 0.3 << "\n"
		<< "0.2 = " << 0.2 << "\n"
		<< "0.2 + 0.3 = " << 0.2 + 0.3 << "\n"
		<< "0.3f = " << 0.3f << "\n"
		<< "0.2f = " << 0.2f << "\n"
		<< "0.2f + 0.3f = " << 0.2f + 0.3f << "\n";


У меня выводится следующее:

0.3 = 0.299999999999999988897769753748434595763683319091796875
0.2 = 0.200000000000000011102230246251565404236316680908203125
0.2 + 0.3 = 0.5
0.3f = 0.300000011920928955078125
0.2f = 0.20000000298023223876953125
0.2f + 0.3f = 0.5


Т.е. почему 0.3 + 0.2, у которых тип double, еще понятно, если сложить их значения действительно будет 0.5.
Но почему 0.2f + 0.3f тоже выводится как 0.5, а не как 0.50000001490116119384765625?
  • Вопрос задан
  • 254 просмотра
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
0.2 = 1.100110011001100110011012 * 2-3
0.3 = 1.001100110011001100110102 * 2-2
Приводим к старшей степени, сохраняя количество двоичных разрядов.
0.2 = 0.110011001100110011001102 * 2-2
Складываем, получаем
0.110011001100110011001102 * 2-2
+
1.001100110011001100110102 * 2-2
=
10.00000000000000000000002 * 2-2
= 1.0000000000000000000002 * 2-1 = 0.5
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@vanyamba-electronics
Здесь уместно вспомнить, что стопроцентно целых чисел не бывает в природе - это всегда округление с некоторой требуемой точностью. Но компьютер построен на бинарной логике, и поэтому лучше всего оперирует именно с целыми числами.
Поэтому, когда вы предлагаете пользователю оперировать числами с плавающей точкой, всегда требуется предоставить ему возможность задавать параметр требуемой точности вычислений. И уже дальше оперировать этими числами, исходя из этих требований.
Потому что если для вас, как программиста, нет никакой разницы между 0.1f и 0.9999999999999f, то для любого пользователя эта разница вполне очевидна.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы