2014-04-12 25 views

回答

4

ldexp, ldexpf, and ldexpl分別爲雙打,浮動和長雙打做到這一點。或者,如果你有兩個特定的功率記(比如4),它可能是最好只劃分通常的方式:

whatever/4 
0

有一個功能ldexp(兄弟姐妹),讓您「乘通過兩個冪「(包括負數),這與使用整數移位不同。對於2的冪,對於X和1/X,所有雙值都是「完美的」(因爲如果X是2 n,則1/X = 2 -n,兩者都可以作爲浮動IEEE-754中的點數或任何其他二進制浮點格式),所以不會有任何奇怪的四捨五入,這意味着編譯器應該能夠用乘法運算代替除法運算 - 在我的實驗中,確實如此。

與「應用乘以1/X」相比,操縱浮點值的指數通常對性能不利。

函數ldexp是glibc中的幾十條指令,其中有幾個分支和一個調用代碼。很難找到ldexp的任何好處,以及讓不知道x = ldexp(x, -1);x /= 2.0;相同的人感到困惑。

0

只需使用

double x = 7; 
x *= 2; 
x /= 2; 
assert(x == 7.0); 

double y = 5; 
y = 2*x + 0.5*y; 
assert(y == 16.5); 

double z = 2.5*x; 
assert(z == 17.5); 

爲什麼?因爲你的計算機可以將所有的權力都表示爲浮點值(只要該權力不超過指數的限制,那就是),並且它會這樣做。因此,上面的所有計算都是精確的,常數中沒有舍入誤差。所有的assert()都保證成功。

當然,您可以通過位操作獲得相同的效果,但當前的浮點硬件可以在納秒內完成乘法運算,並且它可以正確處理所有特殊情況。如果你這樣做,你會浪費時間,或者不正確地處理特殊情況。所以不要嘗試。