странный вывод по сравнению с плаванием с литералом плавающим

float f = 0.7;
if( f == 0.7 )
    printf("equal");
else
    printf("not equal");

Почему вывод not equal ?

Почему это происходит?

34
задан Bo Persson 14 August 2012 в 16:48
поделиться

2 ответа

Это происходит потому, что в вашем операторе

  if(f == 0.7)

0,7 рассматривается как двойное. Попробуйте 0.7f, чтобы убедиться, что значение обрабатывается как число с плавающей запятой:

  if(f == 0.7f)

Но, как предложил Майкл в комментариях ниже, вы никогда не должны проверять точное равенство значений с плавающей запятой.

50
ответ дан 27 November 2019 в 16:26
поделиться

Этот ответ дополняет существующие: обратите внимание, что 0,7 не может быть точно представлен ни как float (или как double). Если бы он был представлен точно, то не было бы потери информации при преобразовании в float, а затем обратно в double, и у вас не было бы этой проблемы.

Можно даже утверждать, что должно быть предупреждение компилятора для литерала константы с плавающей запятой, которые не могут быть представлены точно, особенно когда стандарт настолько нечеткий в отношении того, будет ли округление выполняться во время выполнения в режиме, который был установлен как это время, или во время компиляции в другом режиме округления.

Все нецелые числа, которые могут быть представлены в точности, имеют последнюю десятичную цифру 5 . К сожалению, обратное неверно: некоторые числа имеют последнюю десятичную цифру 5 и не могут быть представлены точно. Маленькие целые числа могут быть представлены точно, а деление на степень 2 преобразует число, которое может быть представлено, в другое, которое может быть представлено, пока вы не входите в область денормализованных чисел.

14
ответ дан 27 November 2019 в 16:26
поделиться