Вопрос

int main()
{
  float x=3.4e2;
  printf("%f",x);
  return 0;
}

Выход:

340.000000 // Это нормально.

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

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

Это было полезно?

Решение

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

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

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

0
0.125
0.25
0.375
...

0,5 имеет точное представление, но 0,1 будет показано как 0,125.

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

Другие советы

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

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

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

Возможно, вам придется точно представить десятичные числа; Это часто происходит в финансовых приложениях. В этом случае вам необходимо использовать специальную библиотеку для представления номеров или просто рассчитать все как целые числа (например, представляющие суммы в центах, а не как доллары и доли доллара).

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top