Запись чисел в файл с большей точностью - C ++ - PullRequest
0 голосов
/ 18 июля 2011

Я записал некоторые параметры (все типа double) в файл для использования при выполнении некоторых сложных вычислений. Я записываю параметры в файлы примерно так:

refStatsOut << "SomeParam:" << value_of_type_double << endl;
где refStatsOut - это параметр ofstream. Существует четыре таких параметра, каждый из которых имеет тип double. То, что я вижу записанным в файл, отличается от его фактического значения (с точки зрения потери точности). Например, если value_of_type_double имел значение -28.07270379934792, то, как я вижу в файле, я вижу -28.0727.

Кроме того, после того, как эта статистика была вычислена и записана, я запускаю разные программы, которые используют эту статистику. Файлы считываются, и значения первоначально сохраняются как std::strings, а затем преобразуются в double с помощью функций atof. Это приводит к значениям, которые я показал выше, и разрушает вычисления далее.

У меня такой вопрос:
1. Есть ли способ повысить разрешение, с которым можно записывать значения (типа double и т. П.) В файл, чтобы НЕ потерять какую-либо точность?
2. Может ли это быть проблемой преобразования std::string в double с atof? Если да, то какую еще функцию я могу использовать для решения этой проблемы?

P.S: Пожалуйста, дайте мне знать, если некоторые детали в этом вопросе не ясны. Я постараюсь обновить их и предоставить более подробную информацию.

Ответы [ 3 ]

4 голосов
/ 18 июля 2011

Вы можете использовать функцию setprecision .

3 голосов
/ 18 июля 2011

ofstream your_file;

вы можете использовать your_file.precision (X);

Основное различие между precision () и setPrecision () состоит в том, что precision возвращает текущую точность, а setPrecision не делает 'т.Таким образом, вы можете использовать точность, как это.

streamsize old_precision = your_file.precision(X);
// do what ever you want

//restore precision
your_file.precision(old_precision);
1 голос
/ 18 июля 2011

a double - это 64-битное целое число, если вы хотите дешевый способ его записи, вы можете сделать что-то вроде этого (заметьте, я предполагаю, что ваш компилятор использует long для 64-битных целых )

double value = 32985.932235;
long *saveme = (long*)&value;

Просто остерегайтесь предостережения о том, что сохраненное значение может не остаться прежним, если оно будет загружено на другую архитектуру.

...