我的问题是我必须使用第三方函数/算法,它需要一个双精度值数组作为输入,但显然对输入数据中非常小的变化很敏感。但是对于我的应用程序,我必须为(几乎)相同的输入获得相同的结果!特别是我有两个测试输入数组,它们在小数点后的第 5 位是相同的,但我仍然得到不同的结果。那么导致“问题”的原因肯定是在小数点后第5位之后。
现在我的想法是将输入四舍五入到稍低的精度,以便从非常相似但不是100% 相同的输入中获得相同的结果。因此,我正在寻找一种很好/有效的方法来将双精度值舍入到略低的精度。到目前为止,我正在使用此代码四舍五入到小数点后的第 9 位:
double x = original_input();
x = double(qRound(x * 1000000000.0)) / 1000000000.0;
这里 qRound() 是来自 Qt 的普通双整数舍入函数。这段代码有效,它确实解决了我对两个“有问题的”测试集的问题。但是:有没有更有效的方法呢?
还有什么困扰我:对于在 -100.0 到 100.0 范围内的输入数据(与我当前的输入数据一样),四舍五入到小数点后的第 9 位可能是合理的。但是,例如,对于 -0.001 到 0.001 范围内的输入数据,它可能太多(即,精度损失太大)。不幸的是,我不知道在其他情况下我的输入值在什么范围内......
毕竟,我认为我需要的是类似于执行以下操作的函数:通过适当的舍入,将给定的双精度值 X 截断到小数点后最多 LN 位置,其中 L 是位置数在双精度可以存储(表示)给定值的小数点之后;并且 N 是固定的,例如 3。这意味着对于“小”值,我们将允许小数点后的位置比“大”值更多。换句话说,我想将 64 位浮点值舍入到(稍微)更小的精度,如 60 位或 56 位,然后将其存储回 64 位双精度值。
你能理解这个吗?如果是这样,你能建议一种在 C++ 中(有效地)做到这一点的方法吗???
提前致谢!