Как сравнить переменную с плавающей запятой с двойной в C? - PullRequest
0 голосов
/ 19 января 2020
float num1 = 1;

if (num1 == 1)
{
     printf("Yes, it is equal!!\n");
}
else
{
     printf("No, it is not equal\n");
}

output -> Да, оно равно!

, тогда как

float num1 = 1.2;

if (num1 == 1.2)
{
    printf("Yes, it is equal!!\n");
}
else
{
    printf("No, it is not equal\n");
}

output -> Нет, оно не равно

, но почему ? Пожалуйста, объясните подробно.

Ответы [ 2 ]

4 голосов
/ 19 января 2020

Несмотря на ваш заголовок, нет никакого сравнения с любым значением int.

num == 1.2 сравнивает значение float в num со значением double 1.2.

Когда 1.2 преобразуется в double в вашей реализации C, он преобразуется в ближайшее представимое значение. Так как ваша реализация C использует двоичную систему для плавающей запятой, она не может точно представлять 1.2, и в преобразовании есть небольшая ошибка.

В float num1 = 1.2;, в результате получается значение double из 1.2 снова преобразуется, на этот раз в float. Поскольку float имеет меньшую точность, чем double, ошибка еще выше. В результате float num1 не равно двойному 1.2.

Таким образом, сравнение num1 == 1.2 оценивается как ложное.

3 голосов
/ 19 января 2020

Будьте очень осторожны при точном сравнении чисел с плавающей точкой. Не все значения могут быть представлены в виде числа с плавающей точкой, потому что не все значения могут быть представлены в виде конечной суммы компонентов, имеющих степень (положительную или отрицательную), равную 2. Та же самая проблема касается удвоения.

Нет ничего хорошего и универсальное решение для вашей проблемы, оно сильно зависит от вида возможных значений, ожидаемой точности и т. д. c.

Вероятно, вам следует перейти к целочисленным значениям, например, умножив число с плавающей запятой на некоторую степень 10, а затем преобразовать (округлить) до int и - наконец - сравнить.

...