浮点舍入误差

foo*_*foo 1 c floating-point floating-point-conversion

输出是

x=1000300  y=1000000,  z=1000300
Run Code Online (Sandbox Code Playgroud)

我能理解我是如何得到x和z但是c的 y输出没有意义.

 #include <stdio.h> 
 int main() 
 { int i=0; 
  float a = 100; 
  a = a*a*a*a*a;  

 float c = 3; 
 float x = 1000000*c + a; 
 float y = a; 
 float z = 0; 

  for (i=0; i<1000000; i++) 
  { y += c; 
    z += c; 
  } 

  z += a; 
  x /= 10000; 
  y /= 10000; 
  z /= 10000; 

 printf("x=%.0f  y=%.0f,  z=%.0f\n", x, y, z); 
 }
Run Code Online (Sandbox Code Playgroud)

Jon*_*ler 5

y从1E10开始(从赋值到a).你这一百万次加3.

麻烦的是a float最多有7个有效小数位数,所以你y每次都不会改变,因此结果除以10,000就是显示的10,000,000 1,000,000.

如果你用它编码double,你会看到更接近你期望的结果.