Comparing Same Float Values In CСтранный выход при сравнении одинаковых значений поплавка?
strange output in comparison of float with float literal
Float addition promoted to double?
Я прочитал выше ссылки на плавающих точек, но даже получить странный вывод.
#include<stdio.h>
int main()
{
float x = 0.5;
if (x == 0.5)
printf("IF");
else if (x == 0.5f)
printf("ELSE IF");
else
printf("ELSE");
}
Теперь, в соответствии с правилами продвижения, не должны "ELSE IF" должен быть напечатан?
Но здесь печатает «IF»
EDIT: Это потому, что 0.5 = 0.1 в двоичной и все равно 0, после этого и потери точности, следовательно, никаких эффектов, поэтому сравнение IF возвращает true.
Если бы это было 0.1, 0.2, 0.3, 0.4, 0.6, 0.7 ...., то Else If блок возвращает true.
Извините, что задал один и тот же вопрос, потому что я прочитал из приведенных выше ссылок, которые не сравниваются с результатами сравнения.
Но, в чем причина этого неожиданного поведения?
[Обычные правила арифметического преобразования] (http://en.cppreference.com/w/c/language/conversion#Usual_arithmetic_conversions) утверждает, что если один из операндов является «double», то другой операнд преобразуется в «двойной». Таким образом, условие 'x == 0.5' на самом деле' (double) x == 0.5', которое, конечно, верно. Однако из-за проблем с значениями с плавающей запятой на компьютерах (см., Например, [Является ли математика с плавающей запятой?] (Http://stackoverflow.com/questions/588004/is-floating-point-math-broken) для деталей), существует очень мало значений, для которых это верно. –
Я все еще думаю, что это немного непонятно, что именно вы спрашиваете, но если я это правильно пойму (и пойду с ответом Герхарда), тогда да, вы правы. –
@Someprogrammerdude Да, это именно то, что я делаю. Благодаря !! –