Как определяется начальное значение управляющего слова с плавающей точкой x87?

122
9

Значение слова управления плавающей точкой x87 можно проверить с помощью _control87. Когда начинается новый поток, на моей платформе он, кажется, наследует значение слова управления с плавающей запятой из родительского потока.


Является ли это поведение undefined, или я уверен, что если я начну новый поток, а в библиотеке потоков нет ошибок, управляющее слово имеет то же значение, что и в родительском потоке?


В каком стандарте определяется это поведение и как? Если он не определен ни в одном стандарте, он определен в руководстве по процессору или документации операционной системы?


Я использую язык С++, разрабатывая на 64-битной Windows 7, компилирую для 32-битной цели Windows и выполняя код с x86-совместимым процессором. Мне нужен ответ специально для этой платформы, но если поведение будет одинаковым для всех языков и процессоров, тогда общий ответ будет лучше.

спросил(а) 2021-01-19T18:46:08+03:00 2 месяца, 3 недели назад
1
Решение
130

Стандарт C (ISO/IEC 9899: 2011) содержит это выражение в пункте 7.6 раздела:


Стойка с плавающей запятой имеет продолжительность хранения потоков. Исходным состоянием для среды с плавающей точкой потоков является текущее состояние среды с плавающей запятой потока, которая создает ее во время создания.



Стандарт С++ (ISO/IEC 14882: 2014) имеет это утверждение в пункте 26.3.1 [cfenv.syn]:

Среда с плавающей запятой имеет длительность хранения потоков (3.7.2). Исходным состоянием для среды с плавающей точкой потоков является состояние среды с плавающей запятой потока, которая строит соответствующие std:: thread object (30.3.1) во время создания объекта.



То есть, как C, так и С++ указывают, что среда с плавающей точкой наследуется от создающего потока. Эта среда с плавающей точкой представляет собой представление уровня языка любого мира управления. Обратите внимание, однако, что нет мандата, поддерживаемого средой с плавающей точкой. Это намекало, например, на сноску 12 С (в 5.1.2.3, выделение - мое):


Стандарт IEC 60559 для двоичной арифметики с плавающей запятой требует определенных пользовательских флажков состояния и режимов управления. Операции с плавающей запятой неявно устанавливают флаги состояния; режимы влияют на результат значения операций с плавающей запятой. Реализации, поддерживающие такое состояние с плавающей запятой, должны учитывать изменения в качестве побочных эффектов. Подробнее см. в приложении F.


ответил(а) 2021-01-19T18:46:08+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема