Регистрация
28 Мар 2013
Сообщения
85
Репутация
0
Спасибо
0
Монет
0
Почему данный код выводит 6, а не 5, ведь мы идём до 100 не включительно?



#include <iostream>

using namespace std;

int main(void) {

float a;

int i = 1;

for(a = .01; a < 1e2; a *= 1e1)

i++;

cout << i;

return 0;

}
 
В начале цикла переменная i имеет значение 1, всего 5 шагов цикла - вот i=6 и получается!. (•‿•)
 
Компилятор рисует предупреждение что float 100 может быть не равен double 100 (1e2)
При сравнении двух величин он преобразовывает float в double. При этом возникает маленькая погрешность. Вот она и влияет на результат.
Читайте об этом про числа с плавающей запятой. Заодно поймете почему иногда 2-1 = 0.9999999999999999999 )
 
ну так наверное 1 + 5 то будет 6? подумал я но тут пришло осознание что с логикой у вас все нормально, а вот с float не очень - посмотрите что такое 0.01 на самом деле (в режиме отладки - просто перед запуском из под визуалки (или в чем вы там) тыкните слева от номеров строки там дожен красный кружочек появиться - это точка приостановки выполения кода) поймете в чем дело и это базовая проблема float

а чож мы указали .01 а не 1e-2? чот как то не консистентно, фи такой быть
 
Назад
Сверху