Есть ли риск использования переменных с плавающей запятой в качестве счетчиков цикла и их дробного увеличения / уменьшения для условий, отличных от «==»?

Безопасно ли использовать поплавки в качестве счетчиков циклов и увеличивать / уменьшать их дробными величинами на каждой итерации, как в безвредной на вид программе ниже? Конечно, я знаю, что использование поплавков в качестве операндов для== Оператор - глупая вещь. Но что плохого в использовании поплавков в качестве операндов для других операций сравнения в «обычных» целях? Под "нормальным" я подразумеваю, что, ну, хотя поплавки не могут бытьточный числовое представление числа, но не такой вариант, как0.000000001 не имеет значения и может быть проигнорировано в большинстве случаев? (Например, в следующей программе это даже не очевидно)

Но это сказало, вот мое опасение. Предположим, что представление не является точным и5.0 на самом деле4.999999. Так как мы продолжаем уменьшаться на0,5 на каждой итерации последнее сравнение с0 может оказаться ложным, и цикл может выйти из-за разницы0.000001и последняя строка токового выхода не будет отображаться. Я надеюсь, что вы поняли мой дрейф. Насколько я не прав?

#include<stdio.h>

int main(void)
{
float f;

for(f=5.0;f>=0;f-=0.5)
printf("%f\n",f);
}

Выход:

5.000000
4.500000
4.000000
3.500000
3.000000
2.500000
2.000000
1.500000
1.000000
0.500000
0.000000

Ответы на вопрос(4)

Ваш ответ на вопрос