У меня есть небольшой пример проблемы, возникшей при переходе от VS2013 к VS2015. В VS2015 далее упомянутый пример кода вызывает недействительную операцию с плавающей запятой.Другая оптимизация в VS2015 vs VS2013 вызывает исключение с плавающей запятой
int main()
{
unsigned int enableBits = _EM_OVERFLOW | _EM_ZERODIVIDE | _EM_INVALID;
_clearfp();
_controlfp_s(0, ~enableBits, enableBits);
int count = 100;
float array[100];
for (int i = 0; i < count; ++i)
{
array[i] = (float)pow((float)(count - 1 - i)/count, 4); //this causes exception in VS2015
}
return 0;
}
Это происходит только в режиме выпуска так что его, вероятно, вызвано различной оптимизации. Что-то не так с этим кодом или это ошибка в VS 2015?
Его трудно найти такие вопросы, как они по всей базе кода, так что я ищу какое-то систематическое исправление не обходной путь (например, использовать другую переменную вместо я, который работает)
Я также проверил генерироваться а в VS2013 он использует целый 128-битный реестр для выполнения 4 операций с плавающей запятой в одном разделе. В VS2015, похоже, всего 2 операции с плавающей точкой, а остальная часть реестра равна нулю (или некоторому мусору), что, вероятно, вводит это исключение.
Инструкция, которая вызывает исключение, помечена на картинке.
Любая помощь будет оценена. Спасибо.
Хм. Ваш код работает для меня (Release/x64) с включенной полной оптимизацией. Является ли ваш ВС актуальным? У вас есть «специальные» настройки компилятора? –
Я использовал обновление VS2015 3. Я использовал стандартные настройки для выпуска + Оптимизация (Максимизировать скорость/O2) и включить встроенные функции (Да/Oi) – Bezousek