浮点减法返回不正确的值

bq5*_*q54 5 c++

所以我有一个计算,其中两个浮点数是向量对象的组成部分被减去,然后似乎返回不正确的结果.

我试图使用的代码是:

cout << xresult.x << " " << vec1.x << endl;
float xpart1 = xresult.x - vec1.x;
cout << xpart1 << endl;
Run Code Online (Sandbox Code Playgroud)

运行此代码的地方将返回

16 17
-1.00002
Run Code Online (Sandbox Code Playgroud)

如您所见,打印出xresult.x和vec1.x的值分别告诉您它们分别是16和17,但减法操作似乎引入了错误.

有什么想法吗?

whe*_*ies 3

这称为浮点运算。这就是为什么数字代码如此“棘手”并且充满陷阱。这个结果是预料之中的。更重要的是,它可能取决于您正在使用的处理器,您将看到它的内容和程度。

我想补充一点,浮点变量的每种类型的变量:float、double、long double 都有不同的精度因子。也就是说,人们可能更能够更准确地表示浮点数的值。这些数字在内存中的存储方式就证明了这一点。

当您查看浮点数时,它包含的有效数字比双精度数或长双精度数要少。因此,当您对它们执行数值计算时,您必须预期浮点数会遭受更大的舍入误差。在处理财务数据时,开发人员经常使用某种类似的“小数”。这些设计得更好,能够以更好的有效数字精度处理货币类型操作。然而它是有代价的。

查看IEEE 745-2008规范。

  • 你的建议总体上很有用,但我认为它不适用于这种情况。16、17 和 -1 都可以精确地表示为浮点数。问题似乎更可能出在输出流的精度上。想象一下,如果输入不是精确的 16 和 17。假设它们是(不精确,但这与这里无关)“15.99999”和“17.00001”,并且输出流之前有“std::set precision(6)”。对于六位小数,输入为 16.0000、17.0000,结果为 -1.00002。更好的建议是让 OP 使用 std::set precision(10),这样他就可以看到发生了什么。 (2认同)