Путаница с числами с плавающей запятой - PullRequest
3 голосов
/ 01 октября 2010
int main()
{
  float x=3.4e2;
  printf("%f",x);
  return 0;
}

Выход:

340.000000  // It's ok.

Но если записать x=3.1234e2, выведите 312.339996, а если x=3.12345678e2, выведите 312.345673.

Почему выходы такие? Я думаю, что если я напишу x=3.1234e2, вывод должен быть 312.340000, но фактический вывод будет 312.339996 с использованием компилятора GCC.

Ответы [ 2 ]

9 голосов
/ 01 октября 2010

Не все дробные числа имеют точный двоичный эквивалент, поэтому он округляется до ближайшего значения.

Упрощенный пример,

если у вас есть 3 бита для дроби, вы можете иметь:

0
0.125
0.25
0.375
...

0.5 имеет точное представление, но 0.1 будет показано как 0.125.

Конечно, реальные различия намного меньше.

2 голосов
/ 01 октября 2010

Числа с плавающей точкой обычно представляются в виде двоичных дробей, умноженных на два, для эффективности.Это примерно так же, как и представление 10, за исключением того, что существуют десятичные дроби, которые нельзя точно представить в виде двоичных дробей.Вместо этого они представлены в виде приближений.

Более того, float обычно имеет длину 32 бита, что означает, что он не имеет столько значащих цифр.Вы можете видеть в своих примерах, что они точны с точностью до 8 значащих цифр.

Однако вы печатаете числа, немного превышающие их значение, и поэтому вы видите разницу.Посмотрите документацию к строке формата printf, чтобы узнать, как печатать меньше цифр.

Возможно, вам потребуется точно представить десятичные числа;это часто происходит в финансовых приложениях.В этом случае вам необходимо использовать специальную библиотеку для представления чисел или просто вычислить все как целые числа (например, представлять суммы в виде центов, а не в долларах и долях доллара).1011 * Что должен знать каждый компьютерщик об арифметике с плавающей запятой , но, похоже, это было бы очень полезно для вас.Кроме того, вы можете использовать форматы Google с плавающей запятой (в частности, стандартные форматы IEEE) или просмотреть их в Википедии, если вам нужны подробности.

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