相关疑难解决方法(0)

什么是将双精度值舍入到(稍微)更低精度的好方法?

我的问题是我必须使用一个thrid-party函数/算法,它将一个double -precision值数组作为输入,但显然可能对输入数据中的非常小的变化敏感.但是对于我的应用程序,我必须获得相同的结果(几乎)相同的输入!特别是我有两个测试输入数组,它们在小数点后的第5个位置是相同的,但我仍然得到不同的结果.那么导致"问题"的原因必须是在小数点后的第5个位置之后.

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

double x = original_input();
x = double(qRound(x * 1000000000.0)) / 1000000000.0;
Run Code Online (Sandbox Code Playgroud)

这里qRound()是Qt的正常的double到整数舍入函数.这段代码有效,它确实通过两个"有问题"的测试集解决了我的问题.但是:有更有效的方法吗?

还有什么困扰我:对于-100.0到100.0范围内的输入数据,舍入到小数点后的第9个位置可能是合理的(就像我当前的输入数据一样).但是,例如,对于-0.001到0.001范围内的输入数据,可能太多(即,太多精度损失).不幸的是,我不知道在其他情况下我的输入值会在什么范围内......

毕竟,我认为我需要的是一个函数,它执行以下操作:通过适当的舍入,将给定的双精度值X切换到小数点后的最多LN位置,其中L是位置数在double -precision可以存储(表示)给定值的小数点之后; 和N是固定的,就像3.这意味着对于"小"值,我们将允许小数点后的位置比"大"值更多.换句话说,我想将64位浮点值舍入到(稍微)更小的精度,如60位或56位,然后将其存储回64位双精度值.

你能理解这个吗?如果是这样,你能否建议一种在C++中有效地做到这一点的方法???

提前致谢!

c++ rounding floating-point-precision

7
推荐指数
1
解决办法
3529
查看次数

如何实现fma()

根据文档,有一个fma()功能math.h.这非常好,我知道FMA如何工作以及如何使用它.但是,我不太确定这在实践中如何实施?我最感兴趣的是x86和x86_64架构.

是否存在FMA的浮点(非向量)指令,可能是IEEE-754 2008定义的?

是使用FMA3还是FMA4指令?

在依赖精度的情况下,是否存在确保使用真实FMA的内在因素?

floating-point instruction-set ieee-754 fma

5
推荐指数
3
解决办法
1372
查看次数