【发布时间】:2008-11-27 02:26:40
【问题描述】:
我有一个为 Linux x86 32 位开发的应用程序。根据结果,有很多浮点运算和大量测试。现在我们将它移植到x86_64,但是在这个架构下测试结果是不同的。我们不想为每个架构保留一组单独的结果。
根据文章 An Introduction to GCC - for the GNU compilers gcc and 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 位精度。
【问题讨论】:
标签: c 64-bit floating-point