【发布时间】:2021-03-30 09:38:45
【问题描述】:
我想我的 c++ 程序遇到了精度问题。而且我不明白为什么我的价值观会得到不同的结果。
res 等于 1321.0000001192093 如果我写的话:
float sy = -0.207010582f;
double res = -1512.*((double)sy - (2. / 3.));
但 res2 等于 1320.9999999839999 如果我写的话:
double res2 = -1512.*(-0.207010582 - (2. / 3.));
当我写这个的时候,为什么 syd 和 syd2 都不一样:
double syd = -0.207010582f;
double syd2 = -0.207010582000000000;
有人可以帮我把我的浮点数正确地转换成双精度并了解发生了什么吗?
【问题讨论】:
-
-0.207010582f是一个浮点数,因此显然它不如-0.207010582精确,后者是一个双精度数。像(double)sy这样的转换是正确的,虽然不是以 C++ 方式(应该是static_cast<double>(sy)。但是向上转换并不会神奇地给你首先使用浮点数而失去的精度。为了避免这种情况,你必须使用双重权利从一开始 -
Sy 由外部 dll 提供,我无法更改其类型。我不明白为什么将这个浮点数转换成双重改变它的价值。
-
如果你想要更高的精度,那么你应该试试 gmpxx
-
这并没有解决问题,但不需要演员表。由于
2. / 3.的类型是double,所以sy的值会被转换成double来匹配。无论有没有演员,计算都是一样的。
标签: c++ casting floating-point double precision