gpt4 book ai didi

c++ - 将 double 值舍入为(稍微)较低精度的好方法是什么?

转载 作者:可可西里 更新时间:2023-11-01 18:38:38 25 4
gpt4 key购买 nike

我的问题是我必须使用第三方函数/算法,它采用 double 数组作为输入,但显然对输入数据中的非常小的变化很敏感.但是对于我的应用程序,我必须为(几乎)相同的输入获得相同的结果!特别是我有两个测试输入数组,它们直到小数点后的第 5 个位置都是相同的,但我仍然得到不同的结果。所以导致“问题”的原因一定是在小数点后第 5 位之后

现在我的想法是将输入四舍五入到略低的精度,以便从非常相似但不是 100% 相同的输入中获得相同的结果。因此,我正在寻找一种好的/有效的方法来将精度值四舍五入到稍微较低的精度。到目前为止,我使用这段代码舍入到小数点后的第 9 位:

double x = original_input();
x = double(qRound(x * 1000000000.0)) / 1000000000.0;

这里的 qRound() 是 Qt 中的普通 double 到整数舍入函数。这段代码有效,它确实解决了我的两个“有问题的”测试集的问题。但是:是否有更有效的方法?

另外让我困扰的是:对于在 -100.0 到 100.0 范围内的输入数据(我当前的输入数据就是这种情况),四舍五入到小数点后第 9 位可能是合理的。但是,例如,对于 -0.001 到 0.001 范围内的输入数据,它可能太多(即精度损失太多)。不幸的是,我不知道在其他情况下我的输入值会在什么范围内......

毕竟,我认为我需要的是类似执行以下操作的函数:通过适当舍入,将给定的 double 精度值 X 截断到最多 L-N小数点后的位置,其中 L 是 double-precision 可以存储(表示)给定值的小数点后的位数; N 是固定的,例如 3。这意味着对于“小”值,我们允许小数点后的位置多于“大”值。换句话说,我想将 64 位浮点值四舍五入为(稍微)更小的精度,如 60 位或 56 位,然后将其存储回 64 位 double 值。

这对你来说有意义吗?如果是这样,您能否建议一种在 C++ 中(有效地)执行此操作的方法???

提前致谢!

最佳答案

如果你看一下 double bit layout ,您可以看到如何将它与一些按位魔术相结合,以实现任意精度的快速(二进制)舍入。您具有以下位布局:

SEEEEEEEEEEEFFFFFFFFFFF.......FFFFFFFFFF

其中 S 是符号位,E 是指数位,F 是小数位。你可以像这样制作位掩码:

11111111111111111111111.......1111000000

和按位与(&) 两者结合在一起。结果是原始输入的舍入版本:

SEEEEEEEEEEEFFFFFFFFFFF.......FFFF000000

并且您可以通过更改尾随零的数量来控制截断多少数据。更多零 = 更多舍入;更少 = 更少。您还可以获得您想要的其他效果:小输入值受到的影响比例小于大输入值,因为每个位对应的“位置”由指数决定。

希望对您有所帮助!

警告:这在技术上是截断而不是真正的舍入(所有值将变得更接近零,无论它们与另一个可能的结果有多接近),但是希望它对您的情况同样有用。

关于c++ - 将 double 值舍入为(稍微)较低精度的好方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14150136/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com