C ++ хранит значение с плавающей точкой в ​​дереве свойств boost - PullRequest
1 голос
/ 26 января 2012

Я пытаюсь изменить некоторую библиотеку, и мне нужно сохранить значение с плавающей точкой в ​​дереве Однако, когда я получаю значение, оно отличается от того, что я там ввел. Это не случается с двойниками. Пример:

Ptree pt;

float f = 230518.391;
pt.put("float", f);
pt.put("double", (double) f)

cout << "f: " << f;
cout << "pt.float: " << pt.get<float>("float");
cout << "pt.double: " << pt.get<double>("double");

Выход: f: 230518,391 pt.float: 230518.406 двойной номер: 230518,391

Что, черт возьми, здесь происходит?

Ответы [ 2 ]

2 голосов
/ 26 января 2012

Возможно сочетание округления "ошибок" и оптимизации компилятора. Округление происходит, когда число с плавающей запятой сохраняется в дереве свойств.

Однако, когда вы храните двойное число, округление не происходит. Теперь в строке pt.put("double", (double) f) компилятор может оптимизировать «f» и поместить туда литерал. Таким образом, компилятор не использует округленное значение. Аналогично для первой команды cout << "f: " << f; Здесь также оптимизируется поплавок, и литерал ставится на его место.

РЕДАКТИРОВАТЬ: только что проверил, может быть, «округленное» значение на самом деле «230518. 9 06

этот сайт может помочь с преобразованием этих чисел:).

1 голос
/ 26 января 2012

Вы должны учитывать, что float - это точность, ограниченная до 7 цифр. Поэтому то, что вы видите, может быть ближайшим хранимым значением для вашего литерала. В этом случае на другие выходные данные может повлиять оптимизация компилятора, чтобы получить правильное значение (компилятор мог бы опустить преобразование f в удвоение и просто поместить литерал на место.

...