Я получаю неожиданное поведение при сравнении значения с плавающей запятой, я понимаю, что поплавки могут иметь проблемы с округлением, но здесь цифры весьма специфичны, чтобы представить эти проблемы.C-кодирование, непредвиденное поведение при сравнении значения с плавающей запятой
#include <stdio.h>
int main()
{
float alpha = 0.0f;
int finish = 0;
while (finish == 0)
{
alpha += 0.05f;
if (alpha > 1.0f)
{
printf("%f", alpha); // Expected result: 1.05f, actual result: 1.0f
finish = 1;
}
}
return 0;
}
Фактически, условие входит, когда α = 1.0f. Не могу понять это поведение ...
Я компилирую с MinGW (GCC 5.3.0) на Windows 10 (протестирован на 32-битных и 64-битных) процессорах Intel i5.
Если вы хотите напечатать 'alpha' с более значимыми цифрами (например,' printf ("%. 7f \ n", alpha); '), вы сразу увидите проблему: http://ideone.com/zwQW7e , –
Вы должны знать, является ли константа для 0.05f немного меньшей или немного больше, чем бесконечный поток битов, который будет точно представлять 0,05. Предположительно, он немного больше. –
Проверьте это (это то, что я использовал для построения моего ответа): http: //www.exploringbinary.com/floating-point-converter/ – Bathsheba