[英]Does the gcc compiler respect the form of expressions as written in my code?
假設我用 c 寫了一個表達式,例如
a = (((b+c) / d) / f) + ((3.14 * e) ) / f) ;
這里 a,b,c,d,e,f 都是雙精度變量。 例如,當我使用帶有一些優化設置的 gcc 編譯器編譯我的代碼時,編譯器是否尊重我編寫的表達式的特定形式,還是修改表達式以使代碼運行得更快? 例如,使用 -O2 優化設置的 gcc 將/可以將上述表達式編譯為
a = ((b+c + 3.14* d * e) / (d*f))
或者它會保持原樣嗎? 我擔心編譯器會改變我的方程的形式,這可能會影響我的表達式的數值穩定性。
編譯器保證生成一個表達式,該表達式產生的結果與編寫公式時的計算結果相同。 這包括表達式可能產生的所有類型轉換、副作用和異常。
特別是,您優化表達式的方法不會通過等效性測試,因為原始表達式中的((b+c) / d)
將根據b
、 c
和d
的類型進行評估,這些類型可能是int
或float
; 另一方面,由於添加了3.14
,您的第二個(優化)公式會在整個表達式上強制使用double
類型。 它還將分子中的e
乘以d
以補償分母中的d*f
,這可能會產生原始公式中不存在的溢出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.