我有一个为 Linux x86 32 位开发的应用程序。根据结果,有很多浮点运算和大量测试。现在我们将它移植到x86_64,但是在这个架构下测试结果是不同的。我们不想为每个架构保留一组单独的结果。
根据文章An Introduction to GCC - 对于 GNU 编译器 gcc 和 g++,问题是 X86_64 中的 GCC 假定fpmath=sse而 x86 假定fpmath=387。387 FPU 对所有操作使用80 位内部精度,并且仅将结果转换为给定的浮点类型(float、double 或 long double),而 SSE 使用操作数的类型来确定其内部精度。
我可以在编译自己的代码时强制 -mfpmath=387并且我的所有操作都可以正常工作,但是每当我调用一些库函数(sin、cos、atan2 等)时,结果又是错误的。我认为这是因为libm是在没有 fpmath 覆盖的情况下编译的。
我尝试使用 387 仿真自己构建 libm(glibc),但它导致了很多崩溃(不知道我是否做错了什么)。
有没有办法强制进程中的所有代码使用 x86_64 中的 387 仿真?或者也许一些库在两种架构上都返回与 libm 相同的值?有什么建议么?
关于“你需要80位精度”的问题,我不得不说这对于个人操作来说不是问题。在这种简单的情况下,差异非常小,没有任何区别。但是,当复合大量操作时,错误会传播,最终结果的差异不再那么小,而且会产生影响。所以我想我需要80位精度。