0

我已经确定 VS2010 C 库中 exp(double) 的 Microsoft 实现在 Win32(即 32 位 x86)和 x64 平台上使用不同的算法,即使我已经为 x86 平台启用了 SSE2 并验证了 SSE2代码路径取自 exp()。不幸的是,对于某些操作数,不同的算法会产生略微不同的结果(相差 1ulp)。在这些情况下,原则上我们都可以接受任一结果,但是在测试期间,Win32 和 x64 构建之间缺乏一致性对我们来说是个问题。我在哪里可以找到可以在两个平台上使用的 exp(double) 的良好(即准确和快速)替代实现?我很高兴有一个使用 SSE2 指令的汇编代码解决方案,如果需要,我可以将它从 32 位转换为 64 位或 vv。

4

1 回答 1

0

可能最好依赖编译器并使用http://www.netlib.org/fdlibm/e_exp.c中的 exp 实现。这是一个准确的实现(1ulp)。使用 sse2 编译,对于 x86 和 x64,结果在这些平台上应该完全相同。源代码没有提供太多使用 mulpd(或 _mm_mul_pd)和 addpd 代替 mulsd 和 adds 的机会。因此,汇编代码解决方案可能不是很有利可图。

于 2013-05-31T09:18:36.903 回答