Нет, все-таки C/C++ способны довести человека до отчаяния. Что происходит? Есть, казалось бы, элементарный цикл для вывода чисел:
#include <iostream>
using namespace std;
int main()
{
for (double x = 1; x <= 7; x += 0.1)
cout << x << endl;
return 0;
}
Выводит числа от 1 до 7 включительно с шагом 0.1. Все понятно. Но если в условии x <= 7 поменять 7 скажем, на 3, то числа уже будут выводиться не до 3, а до 2.9. То же самое с 4 - выводит до 3.9.
С цифрами 5, 6, 7, 8, 9, 10 и т.п. выводит как задумано, т.е. включительно. Не знаю, где там происходит перелом, но если поставить 70, то опять будет выводиться до 69.9.
Интересно, если поменять double на float, то и 3, и 4 и т.п. будут выводиться нормально (но не 2: при двойке выводится до 1.9). Причем с float и x <= 70 интересно еще то, что в некоторых местах числа выводятся с точностью до десятых (как, собственно, и должно быть, ведь приращение идет по 0.1), но в некоторых местах с точностью до десятитысячных (например, 25.5001).
В чем тут вообще дело? Как разобраться с этими типами? Вроде бы значения не выходят за рамки разрядности, так в чем же дело? И, самое интересное, почему в одном случае так, а в другом эдак? Если бы было все правильно, или все неправильно, то было бы понятнее. А так - что это?