C ++在boost属性树中存储浮点值

时间:2012-01-26 15:44:15

标签: c++ boost floating-point boost-propertytree

我正在尝试修改某个库,我需要在ptree中存储一个浮点值。然而,当我检索到它的价值时,它与我放在那里的不同。双打不会发生这种情况。例如:

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 pt.double:230518.391

这到底发生了什么?

2 个答案:

答案 0 :(得分:2)

可能是四舍五入“错误”和“错误”的组合。编译器优化..当float存储到属性树中时发生舍入..

但是,当您存储双倍时,舍入不会发生。现在在pt.put("double", (double) f)行,编译器可能会优化“f”,并将文字放在那里。因此编译器不使用舍入值。类似于第一个cout cout << "f: " << f;这里浮动也被优化掉了,文字放在了它的位置。

编辑:刚刚测试过,可能是“舍入”值实际上是“230518。 9 06

this网站可能有助于转换这些数字:)。

答案 1 :(得分:1)

您需要将float视为精度限制在7位左右。因此,您所看到的可能是您文字的最近可存储浮点值。在这种情况下,其他输出可能会受到编译器优化的影响,以获得正确的值(编译器可以省略将f转换为double并简单地将文字放在适当的位置。