我的问题是我必须使用一个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++中有效地做到这一点的方法???
提前致谢!
根据文档,有一个fma()功能math.h.这非常好,我知道FMA如何工作以及如何使用它.但是,我不太确定这在实践中如何实施?我最感兴趣的是x86和x86_64架构.
是否存在FMA的浮点(非向量)指令,可能是IEEE-754 2008定义的?
是使用FMA3还是FMA4指令?
在依赖精度的情况下,是否存在确保使用真实FMA的内在因素?