Неверный результат при сравнении 0,55 и 0,55f - PullRequest
1 голос
/ 10 июля 2019

В C 0.55 == 0.55f ложно, в то время как 0.5 == 0.5f верно.Чем он отличается?

  1. Сравнение 0.55:

    #include <stdio.h>
    int main() {
        if (0.55 == 0.55f)
            printf("Hi");
        else
            printf("Hello");
    }
    

    Выходы Hello.

  2. Сравнение 0.5:

    #include <stdio.h>
    int main() {
        if (0.5 == 0.5f)
            printf("Hi");
        else
            printf("Hello");
    }
    

    Выходы Hi.

Для обоих фрагментов кода я ожидал Hello.
Почему такая разница?

Ответы [ 2 ]

4 голосов
/ 10 июля 2019

0.5 - это двоично-рациональное и соответствующей величины, поэтому 0.5 составляет ровно половину либо как float, либо double.

То же самое нельзя сказать о 0.55. double будет хранить это число с не меньшей точностью, чем float, и, скорее всего, с большей точностью.

В обоих случаях float неявно преобразуется в double до ==, но к этому времени происходит любое усечение.

3 голосов
/ 10 июля 2019

Вы сравниваете два разных типа значений: double и float.Подумайте об ограничениях размера с неточными числами.

Точные значения (десятичные)

A -> 1/2 с 5 десятичными числами - 0,5000

B -> 1/2с 10 десятичными знаками - 0,5000000000

A == B всегда будет возвращать true

Неточные значения (десятичные дроби)

A -> 1/3 с 5 десятичными знаками - 0,33333

B -> 1/3 с 10 десятичными знаками - это 0,3333333333

A == B -> всегда будет возвращать false, потому что они не совпадают.

Аналогично, 0,55 нельзя представитьточно в двоичном, но 0,5 может быть.

двоичное представление 0,55d -> 0,10001100110011001101 ...

поэтому они не будут равны

двоичное представление 0,5d-> 0,1

Значит, они будут равны

Надеюсь, это очистит ваше сомнение

...