共用方式為


/fp (指定浮點數行為)

更新:2007 年 11 月

在原始程式碼檔案中指定浮點數行為。

/fp:[precise | except[-] | fast | strict ]

旗標

  • precise
    預設值。

    可藉由停用可以變更嚴格 ANSI 一致性所需之浮點計算精確度的最佳化,改善浮點測試相等和不相等的一致性。根據預設,編譯器會使用處理器的 80 位元暫存器來存放浮點計算的中繼結果,這樣可以增加程式的速度並且減小程式的大小。但是由於計算會涉及在記憶體中以小於 80 位元表示的浮點數資料型別,因此帶著額外的精確度位元 (80 位元減去較小浮點型別中的位元數目) 歷經冗長的計算,可能會產生不一致的結果。

    在 x86 處理器上有 /fp:precise,編譯器將在型別浮點數 (Float) 的變數上執行捨入,以及在傳遞參數至函式時,取得指派和轉型的適當精確度。這種捨入方式可保證該資料不保留任何大於其型別容量的數字精確度。以 /fp:precise 編譯的程式可能會比不用 /fp:precise 編譯的程式更慢,而且也更大。/fp:precise 停用內建;而改用了標準執行階段程式庫常式。如需詳細資訊,請參閱 /Oi (產生內建函式)

    下列浮點數行為是以 /fp:precise 啟用:

    • 縮短形式,或以一種複雜的運算取代多種運算,而在結束時只進行一次捨入,是以 /fp:precise 啟用。

    • 將不允許對特殊值 (NaN、+infinity、-infinity、+0、-0) 無效的運算式最佳化。最佳化 x-x => 0、x*0 => 0、x-0 => x、x+0 => x 和 0-x => -x 都因為各種不同原因而無效 (請參閱 IEEE 754 和 C99 標準)。

    • 編譯器將適當地處理涉及 NaN 的比較。例如,如果 x 為 NaN,而且涉及 NaN 的已排序比較引發例外狀況,則 x != x 評估為 true

    • 運算式評估將跟隨在 C99 FLT_EVAL_METHOD=2 之後,並附一個例外狀況。為 x86 處理器設計程式時,因為 FPU 是設定為 53 位元精確度,這將視為長雙精度。

    • 以剛好 1.0 相乘會轉換成使用其他因數,即 x*y*1.0 會轉換成 x*y,同樣地 x*1.0*y 會轉換成 x*y。

    • 以剛好 1.0 相除會轉換成使用被除數,即 x*y/1.0 會轉換成 x*y。同樣地 x/1.0*y 會轉換成 x*y。

    使用 /fp:precise 搭配 fenv_access ON 會停用一些最佳化,例如,浮點運算式的編譯階段評估。例如,如果您以 _control87, _controlfp, __control87_2 變更捨入模式,而編譯器執行浮點數計算,除非 fenv_access 為 ON,否則您指定的捨入模式不會作用。

    /fp:precise 取代 /Op 編譯器選項。

  • fast
    在大部分情況下,以最快方式建立程式碼。/fp:fast 不能搭配 /fp:strict/fp:precise 使用,將使用在命令列上指定的最後選項。/fp:fast/fp:except 會產生編譯器錯誤。

    選取 /Za、/Ze (停用語言擴充功能) (ANSI 相容性),而 /fp:fast 可能會產生非預期的行為。例如,單精度浮點運算可能不會捨入為單精度。

  • except[-]
    可靠的浮點例外狀況模型。例外狀況將在觸發之後立即引發。此選項依預設為關閉狀態。附加負號的選項會明確停用。

  • strict
    最嚴格的浮點模型。/fp:strict 使得 fp_contract 成為 OFF 而 fenv_access 成為 ON。/fp:except 是隱含的,並可透過明確指定 /fp:except- 加以停用。搭配 /fp:except- 使用時,/fp:strict 強制執行嚴格浮點語意,但不顧及例外事件。

備註

相同的編譯中可以指定多個 /fp 選項。

若要由函式控制浮點數行為,請參閱 float_control pragma。

大部分與 /fp:strict/fp:except (及其相對應 pragma) 和 fp_contract pragma 有關的浮點最佳化都與機器相關。/fp:strict/fp:except 都與 /clr 不相容。

/fp:precise 應該會滿足應用程式的大部分浮點需求。必要時,您可以使用 /fp:except/fp:strict,但是在效能上可能會有些降低。如果效能最重要,可能就要使用 /fp:fast

/fp:strict/fp:fast/fp:precise 是精確度 (正確性) 模式,但一次只能有一個生效。如果已指定 /fp:strict/fp:precise,編譯器會使用最後處理的那一個。您無法同時指定 /fp:strict/fp:fast

如需詳細資訊,請參閱 https://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_vstechart/html/floapoint.asp

若要在 Visual Studio 開發環境中設定這個編譯器選項

  1. 開啟專案的 [屬性頁] 對話方塊。如需詳細資訊,請參閱 HOW TO:開啟專案屬性頁

  2. 展開 [組態屬性] 節點。

  3. 展開 [C/C++] 節點。

  4. 選取 [程式碼產生] 屬性頁。

  5. 修改 [浮點模型] 屬性。

若要以程式方式設定這個編譯器選項

請參閱

參考

編譯器選項

設定編譯器選項