gpt4 book ai didi

c - 从 i386 移动到 x86_64 时的浮点精度

转载 作者:太空狗 更新时间:2023-10-29 16:42:49 24 4
gpt4 key购买 nike

我有一个为 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 位精度。

最佳答案

我会说你需要修复你的测试。如果您假设 float 学是准确的,您通常会让自己感到失望。与其测试精确 相等性,不如测试它是否足够接近预期结果。毕竟,您发现的不是错误,所以如果您的测试报告错误,则测试是错误的。 ;)

正如您所发现的,您所依赖的每个库都将采用 SSE float ,因此除非您打算从现在到永远手动编译一切,这样您就可以设置 FP模式到 x87,你最好现在就处理这个问题,接受 FP 数学不是 100% 准确,并且通常不会在两个不同的平台上产生相同的结果。 (我相信 AMD CPU 在 x87 数学中的结果也略有不同)。

您绝对需要 80 位精度吗? (如果是这样,显然没有太多选择,除了自己编译一切以使用 80 位 FP。)

否则,请调整您的测试以在一些小的 epsilon 内执行比较和相等性测试。如果差异小于该 epsilon,则认为这些值相等。

关于c - 从 i386 移动到 x86_64 时的浮点精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/322797/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com