2016-02-08 38 views
-3

我試圖解決,我需要回位水平相當於一個無符號的浮點數乘以4.使用位操作

所以問題浮點乘法到目前爲止,我一直在探索其他的答案和發現一個和我的很相似的,但也沒有工作。真的沒有給出解釋,所以我試圖瞭解當我運行測試用例時出現了什麼問題。

當我測試的問題,我得到

33554432 [0x2000000]。

但我應該

25165824 [0x1800000]

到目前爲止,我的代碼是

unsigned a = (uf >> 0x17) & 0xFF; 
unsigned b = uf & 0x80000000; 
unsigned c = uf & 0x007FFFFF; 
if (a == 0xFF || (a == 0x0 && c == 0x0)) 
    return uf; 
if (a) { 
    a <<= 0x2; 
} else if (c == 0x7FFFFF) { 
    c >>= 0x2; 
    a <<= 0x2; 
} else { 
    c <<= 0x2; 
} 

return (a<<0x17|b|c); 

有什麼建議?

+2

這個問題已經被問到幾天前了。你被告知使用固定寬度的類型。你也不檢查NaN,非規範化和其他特殊編碼。 – Olaf

+0

@Olaf我相信我檢查那些在第一條if語句 – JCD

+0

@DougCurrie我看到了這個問題,但是沒有解決任何答案或解釋代碼 – JCD

回答

1

除非你實際上是在寫一個軟件浮點仿真器(在這種情況下,你需要更多的幫助比我們可以給你),你應該讓編譯器處理這個問題:

#include <stdint.h> 
#include <assert.h> 

static_assert(sizeof(float) == sizeof(uint32_t)); 

uint32_t multiply_by_4_as_float(uint32_t n) 
{ 
    union { 
     uint32_t u; 
     float f; 
    } conv; 

    conv.u = n; 
    conv.f *= 4; 
    return conv.u; 
} 

(這種利用工會在C1999中應用了技術corrigienda並且在C2011中的行爲,在C1989中它是未定義的,並且在C++中它可能仍然是未定義的。)

(如果你問這個問題是因爲你需要在程序中做一點點的浮點數學運算,不能用使用硬件flo爲了某些具體的原因,可能需要檢查你的編譯器的文檔 - 可能有一個選項可以讓你使用它自己的軟件FP。但請記住,軟件浮點數是數量級比硬件慢。)

+1

對於我的任務,我不允許進行這種類型的轉換。另外我對工會組成部分是什麼感到困惑? – JCD

+0

聯合允許將相同的二進制值用作兩種不同的數據類型。定義了兩個成員 - 但它們覆蓋在相同的數據上。 –

+0

@不幸的是,這是不允許的。這種類型的結構在我的分配中是禁止的。我只是很難找出如果我的代碼有問題。我似乎無法在任何地方找到任何有關此問題的幫助。不在任何其他網站或教科書或任何地方。 – JCD