Чтение отчета об ошибке для Clang не поддерживает прагму FENV_ACCESS Я встретил комментарий:
Настройка режима округления без использования
#pragma STDC FENV_ACCESS ON
вызывает неопределенное поведение. См. C11 7.6.1 / 2. (Эта прагма не существует в C ++, поэтому <cfenv> непригоден, но это не наша вина …)
Эта прагма действительно не существует в C ++, рендеринг <cfenv>
непригодный для использования? Я пытался найти его в стандарте C ++ 11, но на самом деле он вообще не упоминается. Прагмы наследуются от C вместе с прототипами функций? Или они на самом деле не нужны, чтобы избежать UB, поскольку стандарт C ++ ничего не говорит о том, что поведение не определено, когда прагма не используется (из-за того, что прагма вообще не упоминается)?
Я искал черновик текста 2015 года и не обнаружил ни одного случая FENV_ACCESS. http://cppreference.com также не имеет ничего об этом.
Тем не мение, http://cplusplus.com действительно упоминает об этом (поскольку это не в стандарте, я думаю, мы должны предположить, что это в лучшем случае консультативная информация):
http://www.cplusplus.com/reference/cfenv/FENV_ACCESS/
Цитата из cplusplus.com: (выделено мое)
Если этот параметр включен, программа информирует компилятор о том, что он может получить доступ к среде с плавающей запятой для проверки своих флагов состояния (исключений) или запуска в режимах управления, отличных от режима по умолчанию.
Если установлено значение off, компилятор может выполнять определенные оптимизации, которые могут подорвать эти тесты и изменения режима, и, таким образом, доступ к среде с плавающей точкой в описанных выше случаях вызывает неопределенное поведение.
Включение или отключение состояния этой прагмы по умолчанию зависит от настроек компилятора и реализации библиотеки.
Принимая во внимание тревожное отсутствие ясности, я хотел бы избежать его использования, если это вообще возможно.
Как всегда, если бы использование было неизбежным, я бы хотел заключить его в один класс, который я могу специализировать и тестировать для каждой архитектуры.
А затем документируйте существование этого класса и проблемы, которые он может вызвать, если обновится реализация компилятора, среды или библиотеки.
Обновить:
В стандарте c ++ очень кратко упоминается заголовок:
§ 26.3 Среда с плавающей точкой [cfenv]
…
2 Заголовок определяет все функции, типы и макросы так же, как в разделе 7.6 стандарта C.
Обновить:
Дополнительная информация здесь: http://en.cppreference.com/w/cpp/preprocessor/impl
Насколько я понимаю, прагма определяется стандартом C11, а не стандартом C ++ 11. Поэтому использование в программе на c ++ строго реализовано / не определено.
Других решений пока нет …