【问题标题】:How is the initial value of x87 floating point control word defined?x87浮点控制字的初值是怎么定义的?
【发布时间】: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


【解决方案1】:

C 标准 (ISO/IEC 9899:2011) 在 7.6 第 2 段中有此声明:

浮点环境具有线程存储持续时间。线程浮点环境的初始状态是在创建时创建它的线程的浮点环境的当前状态。

C++ 标准 (ISO/IEC 14882:2014) 在 26.3.1 [cfenv.syn] 第 3 段中有此声明:

浮点环境具有线程存储持续时间 (3.7.2)。线程的浮点环境的初始状态是构造对应的线程的浮点环境的状态 构造对象时的 std::thread 对象 (30.3.1)。

也就是说,C 和 C++ 都指定浮点环境是从创建线程继承的。这个浮点环境是任何控制世界的语言级表示。但是请注意,没有强制要求支持浮点环境。这暗示了,例如,C 的脚注 12(在 5.1.2.3 中;突出显示的是我的):

二进制浮点运算的 IEC 60559 标准要求某些用户可访问的状态标志和控制模式。浮点运算隐式设置状态标志;模式影响结果 浮点运算的值。 支持此类浮点状态的实现需要将对其的更改视为副作用 - 详情请参阅附件 F。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    • 1970-01-01
    • 2017-05-19
    • 2015-12-30
    • 1970-01-01
    相关资源
    最近更新 更多