Float doesn't change when i add 0.1 to it

后端 未结 3 1070
感情败类
感情败类 2021-01-12 21:38

I am quite a newbie to c. So when i writing a small game demo, i face a really strange problem.

 void testC()
 {
     float a = 825300160;
     float b = a +         


        
相关标签:
3条回答
  • 2021-01-12 22:11

    The fractional portion of a float consists of 23 bits. You need 30 bits to represent 825300160, so the less significant portion of the number is dropped. Adding .1 does not make a difference - you need to add roughly 32 for the number to change:

    float a = 825300160;
    float b = a + 31.5;
    assert(a != b); // No change is detected
    float c = a + 32;
    assert(a != c); // Change is detected
    
    0 讨论(0)
  • 2021-01-12 22:18

    There's not enough precision in the float type. If you really need to distinguish a 0.1 addition to a number as large as 825300160, use double.

    0 讨论(0)
  • 2021-01-12 22:20

    As this site shows, both a and b would be represented as

    0 10011100 10001001100010001010011
    

    in the IEEE standard for floats, where the first bit is the sign, the next 8 are the exponent, and the remaining 23 the mantissa. There's just not enough space in those 23 bits to represent the difference, because the exponent is so large.

    0 讨论(0)
提交回复
热议问题