1

什么决定了 x87 FPU 控制字的默认设置——特别是精度控制字段?编译器是否根据目标处理器设置它?是否有编译器选项可以更改它?

在 Intel Core Duo 处理器上使用 Microsoft Visual C++ 2008 Express Edition,精度控制字段的默认设置为“01b”,表示双精度(53 位)。我想知道 - 为什么默认值不是“11”b,或扩展(64 位)精度?

(我知道我可以使用 _controlfp 更改它。)

4

4 回答 4

2

Microsoft C 运行时 DLL (MSVCRT.DLL) 中有一个错误,它会更改 FPCW,这可能会根据 DLL 加载的顺序改变应用程序的行为。

因此,如果您关心 FPCW 设置,最好的做法不仅是在执行之前将其更改为您想要的设置(即使在函数调用边界上),而且在完成后将其更改回来。(如果您调用任何函数或库,请注意可能会更改它的被调用者,而不是考虑到为您将其更改回来!)

另请注意:FPCW 的修改成本很高,但检查起来并不昂贵。因此,如果很有可能它已经按照您想要的方式设置,您可以通过在修改之前检查它来节省大量时间。

于 2011-03-11T13:52:53.380 回答
0

我一直想知道同一个原始问题。我在 Windows 2000(32 位)上试验了 VC++ 6 和 MinGW。

一个简单的 3 行程序在使用 MinGW (0x037f) 编译时将 FPU 控制字设置为 VC++ 的“双精度”(0x027f) 和“扩展精度”。在同一台机器上,gcc/Linux-32 具有相同的扩展精度(0x37f)。即 MinGW 和 gcc/Linux 似乎具有相同的 FPU 设置。

于 2013-03-22T01:42:12.700 回答
0

当操作系统设置一个进程(或线程)时——比如说,当你的程序启动时,它负责将控制寄存器初始化为默认状态(默认状态可能因平台而异)。它还负责保存和恢复上下文切换周围的状态,以便您的程序不会将状态泄露到也在系统上运行的其他进程中。

除此之外,编译器或语言运行时可能会在执行代码之前修改状态。

所以要么:Windows 的默认 FP 状态是 53 位精度,要么 VS2008 插入代码以将处理器默认设置为 53 位精度。Windows 默认进程状态应记录在平台的 ABI 文档中。

于 2011-02-18T19:14:46.940 回答
0

从理论的角度来看:可能是最后一个使用它的东西,或者除此之外,英特尔决定的任何东西都是一个很好的默认值。

从实际的角度来看:在开始工作之前将其设置为您想要的精度。显式默认值通常优于隐式默认值。

于 2010-03-31T15:09:39.983 回答