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. */
现在我想知道的是,有一种方法,可能是一些编译器选项,可以关闭内部扩展精度浮点寄存器。
我真的得到了你的帮助
答案 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将精度设置为double
和single
。您可能希望使用_controlfp_s(...)
,因为这样可以在设置后显式检索当前控制字。
答案 3 :(得分:1)
正如其他人所说,你可以通过设置x87控制字来限制浮点精度来解决这个问题。但是,更好的方法是让MSVC为浮点运算生成SSE / SSE2代码;我很惊讶它在这个时代默认不会这样做,因为它具有性能优势(以及它可以防止你遇到像你所看到的那样烦人的bug),但是没有考虑MSVC的特质。
除了关于MSVC之外,我相信/arch:SSE2
标志将导致MSVC使用SSE和SSE2指令进行单精度和双精度算术,这应该可以解决这个问题。
答案 4 :(得分:0)
如果你正在使用GCC,那么这里的答案可能有所帮助:
如果您正在使用其他编译器,您可以在该示例中找到一些线索(或者可以发布对该答案的评论,看看Mike Dinsdale是否可能知道。