У меня есть небольшой пример проблемы, возникшей при переходе с VS2013 на VS2015. В VS2015 приведенный далее пример кода вызывает недопустимую операцию с плавающей запятой.
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?
Трудно найти подобные проблемы во всей базе кода, поэтому я ищу какое-то систематическое исправление, а не обходной путь (например, используйте другую переменную вместо i, которая работает)
Я также проверил сгенерированный код сборки, и кажется, что в VS2013 он использует весь 128-битный реестр для выполнения 4 операций с плавающей запятой в одном делении. В VS2015, похоже, выполняются только 2 операции с плавающей запятой, а остальная часть реестра равна нулю (или какой-то мусор), что, вероятно, приводит к этому исключению.
Инструкция, вызывающая исключение, отмечена на картинке.
VS2013 а>
Любая помощь будет оценена. Спасибо.