Comparing float and double

后端 未结 3 654
独厮守ぢ
独厮守ぢ 2020-12-02 00:51
#include 
int main(void){
    float a = 1.1;
    double b = 1.1;
    if(a == b){
        printf(\"if block\");
    }
    else{
        printf(\"else b         


        
3条回答
  •  甜味超标
    2020-12-02 01:33

    The exact value of 1.1 decimal in binary is non-ending fraction 1.00011001100110011001100(1100).... The double constant 1.1 is 53-bit truncation / approximate value of that mantissa. Now this when converted to float, the mantissa will be represented just in 24 bits.

    When the float is converted back to double, the mantissa is now back to 53 bits, but all memory of the digits beyond 24 are lost - the value is zero-extended, and now you're comparing (for example, depending on the rounding behaviour)

    1.0001100110011001100110011001100110011001100110011001
    

    and

    1.0001100110011001100110000000000000000000000000000000
    

    Now, if you used 1.5 instead of 1.1;

    1.5 decimal is exactly 1.1 in binary. It can be presented exactly in just 2 bit mantissa, therefore even the 24 bits of float are an exaggeration... what you have is

    1.1000000000000000000000000000000000000000000000000000
    

    and

    1.10000000000000000000000
    

    The latter, zero extended to a double would be

    1.1000000000000000000000000000000000000000000000000000
    

    which clearly is the same number.

提交回复
热议问题