8

你好,

我正在尝试使用来自 Jonathan Richard Shewchuk 的计算几何的 稳健谓词

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

关键是谓词应该允许具有自适应浮点精度的精确算术。在我的电脑上:Asus 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.              */

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

我真的很感谢你的帮助

4

5 回答 5

3

您想要的 Visual Studio 编译器选项/fp:strict在 IDE 中公开为Project->Properties->C/C++->Code Generation->Floating Point Model

于 2010-04-02T09:13:25.427 回答
3

是的,您必须更改 FPU 控制字以避免这种情况。此网页中对大多数流行的编译器进行了很好的解释。请注意,这与大多数库期望 FPU 做的事情完全不兼容,不要混搭。完成后始终恢复 FPU 控制字。

于 2010-04-02T10:44:31.820 回答
2

_control87(_PC_53, _MCW_PC)或者_control87(_PC_24, _MCW_PC)会成功。那些将精度分别设置为 MSVCdoublesingle使用 MSVC。您可能想要使用_controlfp_s(...),因为它允许您在设置后显式检索当前控制字。

于 2010-04-02T16:09:30.643 回答
1

正如其他人所指出的,您可以通过设置 x87 控制字来限制浮点精度来处理这个问题。但是,更好的方法是让 MSVC 为浮点运算生成 SSE/SSE2 代码;考虑到性能优势(以及它可以防止遇到像您所看到的那样令人讨厌的错误这一事实),我很惊讶它在当今时代默认情况下并没有这样做,但是没有考虑到 MSVC 的特质。

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

于 2010-04-03T03:33:26.543 回答
0

如果您使用的是 GCC,此处的 SO 答案可能会有所帮助:

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

于 2010-04-02T08:26:07.063 回答