Можно ли использовать поплавки в качестве счетчиков циклов и увеличивать/уменьшать их на дробные суммы на каждой итерации, как, например, в безрисковой программе ниже? Конечно, я знаю, что использование float в качестве операндов для == оператор - это тупое дело. Но что не так с использованием поплавков в качестве операндов для других операций сравнения для «нормальных» целей? Под «нормальным» я подразумеваю, что, ну, хотя плавающие значения могут быть неточным точным численным представлением числа, но не являются ли такие изменения, как 0.000000001
, неуместными и в большинстве случаев могут быть проигнорированы? (Например, в следующей программе, которая даже не очевидно)Любой риск использования переменных float как счетчиков циклов и их дробное приращение/декремент для условий без «==»?
Но что сказал, вот мой apprehension.Suppose представление не является точным и 5,0 фактически 4,999999 .so, как мы идем на уменьшающего по 0,5 на каждой итерации, последнее сравнение с может получиться ложным, и петля может выйти из-за разницы 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
+1 Хороший ответ. –
Должно быть ясно, что эти критерии применимы к циклам, заканчивающимся на нуле. Если у вас есть цикл, который работает от + X до -Y, например, тогда могут возникнуть ошибки, если Y больше X. –
@EricPostpischil: Я думаю, что условие, что результирующее значение между ними должно быть представимым, охватывает этот случай? – nhahtdh