我试图了解GNURadio中的浮点运算,并开始研究他们的测试。该测试将生成随机浮点输入和随机抽头,然后将所有内容传递给滤波器。稍后,它使用一些余量比较预期输出和实际输出。
关于该边距有一个神秘的评论:
// we use a sloppy error margin because on the x86 architecture,
// our reference implementation is using 80 bit floating point
// arithmetic, while the SSE version is using 32 bit float point
// arithmetic.
我在源代码中找不到任何80bit算术。谁能帮我?或者只是解释为什么误差幅度取决于丝锥尺寸?
在x86 + 87上,即使简单地使用它double
也可以获得80位精度的中间结果,因为FPU堆栈内部使用80位浮点数。
如果您的代码期望并依赖于64位或32位浮点运算的四舍五入,您会感到惊讶。
例如,我x < y
被真实性之类的东西打了好几次,但是在分配之后,z = x
您可能会得到z >= y
(声明了所有var double
)。如果x
最终将其分配到80位FPU寄存器中,z
而是内存中的实际64位浮点变量,则可能会发生这种情况。
g ++有一个避免这些问题的特定选项(-ffloat-store
),可以防止使用多余的位(但是会大大降低数学运算的代码的速度)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句