我有一个为Linux x86 32位开发的应用程序.根据结果,有许多浮点运算和大量测试.现在我们将它移植到x86_64,但测试结果在这个架构中是不同的.我们不希望为每个体系结构保留单独的结果集.
根据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位精度.