我正在尝试修改某个库,我需要在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
这到底发生了什么?
答案 0 :(得分:2)
可能是四舍五入“错误”和“错误”的组合。编译器优化..当float存储到属性树中时发生舍入..
但是,当您存储双倍时,舍入不会发生。现在在pt.put("double", (double) f)
行,编译器可能会优化“f”,并将文字放在那里。因此编译器不使用舍入值。类似于第一个cout cout << "f: " << f;
这里浮动也被优化掉了,文字放在了它的位置。
编辑:刚刚测试过,可能是“舍入”值实际上是“230518。 9 06
this网站可能有助于转换这些数字:)。
答案 1 :(得分:1)
您需要将float
视为精度限制在7
位左右。因此,您所看到的可能是您文字的最近可存储浮点值。在这种情况下,其他输出可能会受到编译器优化的影响,以获得正确的值(编译器可以省略将f
转换为double并简单地将文字放在适当的位置。