Напишите float с полной точностью в C ++ - PullRequest
5 голосов
/ 06 сентября 2011

Можно ли в C ++ записывать и считывать число с плавающей запятой (или двойное число) в текстовом формате без потери точности?

Рассмотрим следующее:

float f = ...;
{
    std::ofstream fout("file.txt");
    // Set some flags on fout
    fout << f;
 }
 float f_read;
 {
     std::ifstream fin("file.txt");
     fin >> f;
  }
  if (f != f_read) {
      std::cout << "precision lost" << std::endl;
  }

Я понимаю, почему потеря точностииногда.Однако, если я напечатаю значение с достаточным количеством цифр, я смогу прочитать одно и то же значение.

Существует ли заданный набор флагов, который гарантированно никогда не потеряет точность?Будет ли это поведение переносимым на разные платформы?

Ответы [ 4 ]

4 голосов
/ 07 сентября 2011

Если вам не требуется поддержка платформ, в которых отсутствует поддержка C99 (MSVC), лучше всего на самом деле использовать спецификатор формата %a с printf, который всегда генерирует точное (шестнадцатеричное) представление номер при использовании ограниченного числа цифр. Если вы используете этот метод, то при преобразовании в строку или обратно округление не происходит, поэтому режим округления не влияет на результат.

4 голосов
/ 06 сентября 2011

если я напечатаю значение с достаточным количеством цифр, я смогу прочитать то же самое значение

Нет, если вы запишите его в десятичном виде - нет целочисленной зависимости между количеством двоичных цифр и количеством десятичных цифр, необходимых для представления числа. Если вы напечатаете свой номер в двоичном или шестнадцатеричном формате, вы сможете прочитать его обратно без потери точности.

В общем случае числа с плавающей запятой не переносимы между платформами, поэтому ваше текстовое представление не сможет преодолеть этот разрыв. На практике большинство машин используют числа с плавающей точкой IEEE 754, поэтому, вероятно, это будет работать достаточно хорошо.

3 голосов
/ 06 сентября 2011

Посмотрите на эту статью: Как печатать числа с плавающей точкой точно , а также на это: Быстро и точно печатать числа с плавающей точкой .

Это также упоминается в стеке здесь , и здесь есть некоторый указатель на реализацию здесь .

1 голос
/ 06 сентября 2011

Вы не можете обязательно печатать точное значение «степени двойки» в десятичном виде.
Подумайте об использовании основания три для хранения 1/3, теперь попробуйте напечатать 1/3 в десятичном виде.

Решения см .: Как вы печатаете ТОЧНОЕ значение числа с плавающей запятой?

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