Почитайте про ошибки округления плавающей точки. Используйте »= и «= в if при работе с такими числами. Тут почитайте
0.1 - это литерал типа double 0.1f - это литерал типа float На строке 4 объявление переменной типа float и выполнение присваивания значения, при этом для значения double выполняется приведение типа. На строке 7 вызываете оператор if для дух значений с разными типами, компилятор приводит зачем-то тип float к типу double и вызывает оператор сравнения. Вы можете помочь компилятору решить эту сложную задачу Спойлер: код Код (Text): int main() { float f = 0.1; std::cout << "float value: " << f << std::endl; std::cout << " (f == 0.1) "; if (f == 0.1) std::cout << "true" << std::endl; else std::cout << "false" << std::endl; std::cout << " ((double)f == 0.1) "; if ((double)f == 0.1) std::cout << "true" << std::endl; else std::cout << "false" << std::endl; std::cout << " (f == 0.1f) "; if (f == 0.1f) std::cout << "true" << std::endl; else std::cout << "false" << std::endl; std::cout << " (f == (float)0.1) "; if (f == (float)0.1) std::cout << "true" << std::endl; else std::cout << "false" << std::endl; return 0; } Спойлер: вывод Код (Text): float value: 0.1 (f == 0.1) false ((double)f == 0.1) false (f == 0.1f) true (f == (float)0.1) true
Из за округления, в этом вся печаль типов двойной точности. В переменной f сохранен float, из него делаем грубую поделку, похожую на 0.1 и сравниваем с кошерным даблом от 0.1
Потому что Алексей написал вырожденный пример, где сравнение ВЫЧИСЛЯЕТСЯ оптимизатором. В реале сравнивать вещественные числа на равенство надо так, и только так: Код (C++): if (fabs(a-b) < eps) { равны. } Короче, если не вдаваться в подробности, единственно верный вариант сравнения на равенство - в первом абзаце этого поста, остальное - от лукавого, и может привести к некислой попоболи в некоторых случаях. Правка: удалил сентенцию про платформозависимость, ибо есть IEEE. Хотя, емнип, на некоторых платформах AVR double 32х-битный (sic!).
В том же IAR для того же AVR double можно настроить как 64 бита. Так что от самой платформы зависимости нет. Есть зависимость от компилятора.
Да, пробежался - в GCC действительно для совместимости по умолчанию 32-х битный double в настройках случается. Спс за поправку.
Да все верно было, так оно и есть. float представлен в памяти по стандарту ieee754 и использует 32 бита, double как правило тоже по этому стандарту, только совсем не обязательно что на double отведено тоже 32, зачастую отводится 64.