ошибки округления с плавающей точкой - PullRequest
1 голос
/ 21 февраля 2011

Вывод

x=1000300  y=1000000,  z=1000300

Я могу понять, как я получил 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); 
 }

1 Ответ

5 голосов
/ 21 февраля 2011

Значение в y начинается с 1E10 (из присвоения a).Вы добавляете к этому миллион раз 3.

Проблема в том, что float имеет не более 7 значащих десятичных цифр, поэтому вы фактически не меняете y каждый раз, следовательно, результат, деленный на 10000, равен 10 000 000 1 000 000, как показано.

Если вы закодируете его с помощью double, вы увидите более близкий результат, который вы ожидаете.

...