我正在寫一個算法,將浮點數除以2. 在數字已經規範化(指數位> 0)的情況下,我認爲這個過程非常簡單。我認爲簡單地將指數字段減1,然後將該值粘貼回來是一種正確的方法。將非規格化數除以2
我遇到了如何處理已經非規範化的浮點數(指數位全爲0)的問題。 我明白什麼是非正規化的數字,並且相信我通常明白劃分它們的意義。我正在運行我通過另一個程序編寫的算法,這裏有一條消息讓我困惑:
將值0x7fffff傳遞給函數返回3fffff。該函數應該返回0x400000。
我真的不明白這裏發生了什麼,爲什麼這應該返回這個指定的值。有沒有人可以嘗試解釋這個,爲什麼它應該返回這個值?
我最初處理非規格化數字的方法是將小數位右移一位(除以2),這似乎並不是所需的過程。
以下是我有:
unsigned float_half(unsigned uf) {
unsigned exp = uf & (0x7F800000);
unsigned sign = uf & (0x80000000);
unsigned fract = uf & (0x007FFFFF);
// Check for NaN or infinity
if(exp == 0x7F800000) {
return uf;
}
// Check for denormalized numbers
if(exp == 0x00000000) {
// Need to do something here, not really sure...
return sign | exp | fract;
}
// Check for exponent of 1 (going to a denormalized number changes things)
if(exp == 0x00800000) {
fract = (0x00FFFFFF & uf) >> 1;
return fract | sign;
}
exp--;
exp = exp & (0x7F800000);
return sign | exp | fract;
}
@caf:是不是我已經這樣做了嗎?你爲什麼覺得有必要提一提? – 2012-02-01 03:54:18
對不起,你是 - 我只是對你的第一段文本作出反應,你沒有提到指數1的例外,而不是你所做的代碼。 – caf 2012-02-01 04:44:32
@caf:沒問題,謝謝你的輸入。 – 2012-02-01 04:50:04