MSVC эквивалентен GCC -fno-finite-math-only?

#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