Visual C ++中的浮点精度

时间:2010-04-02 08:16:10

标签: c++ visual-c++ floating-point math floating-accuracy

HI,

我试图将robust predicates用于Jonathan Richard Shewchuk的计算几何。

我不是程序员,所以我甚至不确定我在说什么,我可能会做一些基本的错误。

关键是谓词应该允许具有自适应浮点精度的精确算法。在我的电脑上:华硕pro31 / S(Core Due Centrino处理器)它们无法正常工作。问题可能在于我的计算机可能会使用与Shewchuk使用的浮点精度冲突的一些改进。  作者说:

/* On some machines, the exact arithmetic routines might be defeated by the  */
/*   use of internal extended precision floating-point registers.  Sometimes */
/*   this problem can be fixed by defining certain values to be volatile,    */
/*   thus forcing them to be stored to memory and rounded off.  This isn't   */
/*   a great solution, though, as it slows the arithmetic down.              */

现在我想知道的是,有一种方法,可能是一些编译器选项,可以关闭内部扩展精度浮点寄存器。

我真的得到了你的帮助

5 个答案:

答案 0 :(得分:3)

Visual Studio所需的编译器选项是/fp:strict,它在IDE中显示为Project->Properties->C/C++->Code Generation->Floating Point Model

答案 1 :(得分:3)

是的,您必须更改FPU控制字以避免这种情况。这个web page中的大多数热门编译器都很好地解释了它。请注意,这与大多数库希望FPU执行的操作非常不兼容,请不要混用和匹配。完成后,请务必恢复FPU控制字。

答案 2 :(得分:2)

_control87(_PC_53, _MCW_PC)_control87(_PC_24, _MCW_PC)可以解决问题。那些分别使用MSVC将精度设置为doublesingle。您可能希望使用_controlfp_s(...),因为这样可以在设置后显式检索当前控制字。

答案 3 :(得分:1)

正如其他人所说,你可以通过设置x87控制字来限制浮点精度来解决这个问题。但是,更好的方法是让MSVC为浮点运算生成SSE / SSE2代码;我很惊讶它在这个时代默认不会这样做,因为它具有性能优势(以及它可以防止你遇到像你所看到的那样烦人的bug),但是没有考虑MSVC的特质。

除了关于MSVC之外,我相信/arch:SSE2标志将导致MSVC使用SSE和SSE2指令进行单精度和双精度算术,这应该可以解决这个问题。

答案 4 :(得分:0)

如果你正在使用GCC,那么这里的答案可能有所帮助:

如果您正在使用其他编译器,您可以在该示例中找到一些线索(或者可以发布对该答案的评论,看看Mike Dinsdale是否可能知道。