【发布时间】:2016-08-29 11:33:38
【问题描述】:
x87 浮点控制字的值可以用_control87 检查。当一个新线程启动时,在我的平台上它似乎从父线程继承了浮点控制字的值。
这是未定义的行为,还是我保证如果我启动一个新线程,并且线程库没有错误,控制字的值与它在父线程中的值相同?
在哪个标准中定义了这种行为,如何定义?如果没有在任何标准中定义,是在处理器手册还是操作系统文档中定义?
我使用 C++ 语言,在 64 位 Windows 7 上开发,为 32 位 Windows 目标编译,并使用 x86 兼容处理器执行代码。我需要专门针对该平台的答案,但如果所有语言和处理器的行为都相同,那么通用答案会更好。
【问题讨论】:
-
C++ 并没有真正定义任何关于浮点环境的内容。即使在标准中提到
cfenv实际上也是非语义噪音。 -
特定于您的平台的是控制字的 x87 精度位,坏软件因更改而臭名昭著,但如果它们与环境不匹配,则会完全破坏 IEEE 算法的微妙之处编译器的意图。在 Windows 上,我认为即使是默认设置也被破坏了......
-
AFAIK,这对于不同的编译器是不同的。要获得默认值,只需将其作为您在应用程序中执行的第一件事来阅读。我从经验中知道,例如,VC++ 编译的 DLL 甚至将其更改为默认值,这可能会导致具有不同默认值的程序出现问题。
标签: c++ c floating-point x87