浮點運算的優化

2021-04-12 13:43:30 字數 644 閱讀 5747

比如對於**

int x,y;

...y=(x+1)+(2*x-2);

那麼我們很清楚,編譯器可以將上面的**優化為

y=3*x-1;//實際上還會優化為y=(x<<1)+x-1

可是如果換成浮點型別呢?比如

double x,y;

...y=(x+1)+(2*x-2);

呢?這時候,標準編譯選項下面,編譯器不會做任何優化。

這個是因為,對於浮點數做的任何優化都是不安全的。

比如乙個程式中可能會使用

while(err+1.0!=1.0)

來判斷err是不是相對於1.0很小,

但是如果編譯器將兩邊的1.0都優化了,變成

while(err!=0.0)

那麼**語義就發生變化了。

所以現在的編譯器一般來說,對於浮點數相關的運算都是基本不做優化的,唯一可以做的優化就是除上乙個常數可以優化為乘上乙個常數。

比如x/2.0可以優化為x*0.5

當然,很多編譯器會提供一些特殊的編譯選項,使得使用者可以利用這個選項對於某些浮點運算進行強制優化,當然這樣的優化就不一定安全了,比如gcc中可以使用

-ffast-math

編譯選項強制對浮點運算使用不符合ieee浮點標準的優化(比如上面的交換律等)

ARM 浮點運算,軟浮點,硬浮點

很多時候我們要處理的資料,不僅僅是整數和字串,還有浮點數即小數。在多 資料處理方面表現的更多。是不是所有的cpu都支援,浮點運算呢?答案 不是。我們常常聽到贏浮點和軟浮點,這些到底說的是什麼呢?下面我們就來一 竟吧。在這裡我們說的是arm核浮點運算。1 硬浮點 hard float 編譯器將 直接編...

浮點指令的優化

現在的編譯器都能夠針對浮點指令做優化,但是,我還是想你推薦vc,我認為,vc的優化更好,它能夠更好地利用pentium系列處理器的流水線。優化概略 盡量理解你的編譯器處理浮點指令的原理,要知道,你不可能把乙個程式完全用浮點指令來寫,更多的 還是基於高階語言的。找出程式的關鍵所在,例如迴圈等 這些是真...

ARM 浮點運算

很多時候我們要處理的資料,不僅僅是整數和字串,還有浮點數即小數。在多 資料處理方面表現的更多。是不是所有的cpu都支援,浮點運算呢?答案 不是。我們常常聽到贏浮點和軟浮點,這些到底說的是什麼呢?下面我們就來一 竟吧。在這裡我們說的是arm核浮點運算。1 硬浮點 hard float 編譯器將 直接編...