我有一個從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次浮動操作,其餘的註冊表都是零(或一些垃圾),這可能會引入此異常。
導致異常的指令被標記在圖片中。
任何幫助將不勝感激。 謝謝。
嗯。您的代碼適用於啓用了全面優化的我(版本/ x64)。你的VS是最新的嗎?你有什麼「特殊的」編譯器設置? –
我使用VS2015更新3.我使用標準設置進行發佈+優化(最大化速度/ O2)並啓用固有功能(是/否) – Bezousek