0

我想在 Windows 软件的 gcc/Linux 移植版本中实现完全相同的浮点结果。出于这个原因,我希望所有双精度操作都是 64 位精度的。这可以使用例如 -mpc64 或 -msse2 或 -fstore-floats 来完成(所有这些都有副作用)。然而,我无法解决的一件事是超越函数,如 sin/asin 等。文档说他们在内部期望(并且我想使用)长双精度,并且无论我做什么,它们产生的结果都与 Windows 对应物不同。

这些函数如何使用 64 位浮点精度计算结果?

更新:我错了,是 printf("%.17f") 错误地舍入了正确的双精度结果,gdb 中的 "print x" 表明数字本身是正确的。我想我需要对此提出一个不同的问题......也许关于如何使 printf 不在内部将 double 视为扩展。也许使用 stringstream 会产生预期的结果......是的。

4

3 回答 3

0

我发现 printf("%.17f") 使用不正确的精度来打印结果(可能在内部扩展),当我使用 stringstream << setprecision(17) 结果是正确的。所以答案与问题并不真正相关,但至少它对我有用。

但是,如果有人提供一种使 printf 产生预期结果的方法,我会很高兴。

于 2013-02-25T09:36:24.897 回答
0

不同的 LibM 库对基本函数使用不同的算法,因此您必须在 Windows 和 Linux 上使用相同的库才能获得完全相同的结果。我建议编译FDLibM它并将其与您的软件静态链接。

于 2013-02-25T09:09:38.657 回答
0

超越函数问题的一个很好的解决方案是使用 GNU MPFR 库。但请注意,Microsoft 编译器不支持扩展精度浮点。对于 Microsoft 编译器,double 和 long double 都是 53 位精度。使用 gcc,long double 是 64 位精度。要在 Windows/linux 上获得匹配结果,您必须避免使用 long double 或避免使用 Microsoft 编译器。对于许多 Windows 项目,gcc (mingw) 的 Windows 端口运行良好。这让 Windows 项目可以使用 64 位精度的长双精度数。mingw long double 支持的一个问题是 mingw 使用 Microsoft 库进行 printf 等调用。出于这个原因,打印长双精度不能正常工作。解决此问题的方法是使用 mpfr_printf。

于 2013-05-30T05:32:32.627 回答