gcc和sin / cos / transcendental函数就像在Windows中一样精确

时间:2013-02-25 08:19:47

标签: c++ gcc floating-point

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

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

更新:我错了,它是printf(“%。17f”)错误地舍入正确的双重结果,gdb中的“print x”表示数字本身是正确的。我想我在这个问题上需要一个不同的问题......也许是关于如何使printf不要在内部处理双重扩展。也许使用stringstream会给出预期的结果......是的。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

但如果有人提供一种方法让printf产生预期效果,我会很高兴。

答案 2 :(得分: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 support的一个问题是mingw使用Microsoft库进行诸如printf之类的调用。因此,打印长双精度打印不正常。解决此问题的方法是使用mpfr_printf。