2016-10-21 8 views
9

В GCC мы включаем -ffast-math для ускорения вычислений с плавающей запятой. Но, как мы полагаемся на правильное поведение значений с плавающей точкой NaN и Inf, мы также включить -fno-finite-math-only, так что оптимизация, которые принимают значения не являются NaN/InfMSVC эквивалентен GCC -fno-final-math-only?

Для MSVC, то «эквивалент» для -ffast-math, по-видимому /fp:fast. Однако, как и у GCC -ffast-math, это also includes оптимизация, предполагающая, что Nan/Inf нет. (Критически, кажется, что тесты, такие как std :: isnan(), не гарантируют получение «точных» результатов.)

Есть ли опция для компиляции MSVC C++, которая позволяет вам использовать большинство оптимизаций /fp:fast, но все же рассматривает значения NaN и Inf «правильно»? (Или, по крайней мере, гарантирует, что тесты, как станд :: IsNaN()/станд :: isinf() обнаружит NaN/Inf, если они случаются, которые будут созданы.)

+0

Скорее всего, вы не найдете такой переключатель. Насколько я знаю, каждый коммутатор, добавленный в компилятор, удваивает усилия по тестированию на стороне Microsoft. Вот почему они сейчас неохотно добавляют новые коммутаторы. – stgatilov

ответ

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