Сравнение числовых типов данных в C # - PullRequest
2 голосов
/ 20 сентября 2019

Не могли бы вы объяснить результаты следующего кода:

    float f = 1.56898138E+09f;
    double d = 1.56898138E+09;
    int i = 1568981320;

    bool a = f > i; //false 
    bool b = d > i; //true
    bool c = (int)f > i; //true

Почему a == false?

Ответы [ 2 ]

4 голосов
/ 20 сентября 2019

Существует неявное преобразование из int в float.Это редкий пример неявного преобразования с потерями.

(float)1568981320 = 1568981376f, то же значение, что и f, поэтому не больше и не меньше.

2 голосов
/ 20 сентября 2019

Ну, int использует все 32 биты для хранения целочисленного значения

 1568981320 == 1011101100001001100000101001000 (binary)

, когда float использует 23 биты * только 1010 * с первым всегда 1 (https://en.wikipedia.org/wiki/Single-precision_floating-point_format),, поэтому начальное значение 1011101100001001100000101001000 должно быть округлено :

 1011101100001001100000101001000
                         ^ 
 ^                       from this on we should throw the "1001000" bits away
 |   
 this 1 can be skipped since float assumes that the 1st bit is always 1 

Так что при округлении мы должны выбросить 1001000 идобавьте 1:

 1011101100001001100000101001000 - original value (1568981320)

 1011101100001001100000110000000 -  rounded value (1568981376)
  ^                     ^
  will be stored in float   

, и это 1568981376 значение, которое на больше , чем оригинал 1568981320

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...