#c #visual-c #ieee-754
#c #visual-c #ieee-754
Вопрос:
В GCC мы включаем -ffast-math
ускорение вычислений с плавающей запятой. Но поскольку мы полагаемся на правильное поведение значений с плавающей запятой NaN и Inf, мы также включаем -fno-finite-math-only
, так что оптимизация, которая принимает значения не NaN / Inf
Для MSVC «эквивалент», по-видимому, -ffast-math
является /fp:fast
. Однако, как и GCC -ffast-math
, он также включает оптимизации, которые предполагают, что Nan / Inf отсутствуют. (Критически, похоже, что тесты, подобные std::isnan(), не гарантированно дают «точные» результаты.)
Есть ли опция для компиляции MSVC C , которая позволяет вам воспользоваться большинством /fp:fast
оптимизаций, но при этом «правильно» обрабатывает значения NaN и Inf? (Или, по крайней мере, гарантирует, что тесты типа std:: isnan() / std::isinf() обнаружат NaN / Inf, если они действительно будут сгенерированы.)
Комментарии:
1. Скорее всего, вы не найдете такого переключателя. Насколько я знаю, каждый переключатель, добавленный в компилятор, удваивает усилия по тестированию на стороне Microsoft. Вот почему они довольно неохотно добавляют новые коммутаторы сейчас.
Ответ №1:
guarantees that tests like std::isnan()/std::isinf()
В отличие от GCC, MSVC (CL RC 19) фактически не оптимизирует std::isnan
настройки /fp:fast
:
Другой альтернативой, которая никогда не будет оптимизирована, является вызов C99 isnan
или встроенного MSVC _isnanf
. Или проведите свой собственный nan
тест против известной битовой маски, которая может быть сгенерирована с помощью std::numeric_limits::quiet_NaN
.
Смотрите:https://godbolt.org/g/YdZJq5