0

我正在使用浮點型24位來將浮點值存儲在恩智浦編譯器MRK III中。它將24位浮點值作爲3字節十六進制存儲在數據存儲器中。 現在,當我使用IEEE 754浮點轉換將數字從二進制恢復爲真實時,我收到了一些非常奇怪的東西。Float24(24位浮點數)爲十六進制?

讓我把它用一個例子這樣 -

注 - 「因爲我的編譯器支持浮動24位(與浮動32一起),我指定的值這樣的事情」

樣本程序:

float24 f24test; 
float f32test; 

f32test= 2.9612; 
f24test= (float24)f32test; 

在調試窗口輸出(全局變量): - (在同一時間數據存儲器)存儲在DM

f32test = 2.961200e+000 
f24test = 2.9612e+000 

值作爲從調試器捕獲的 -

f32test = 40 3d 84 4d (in hex) 

f24test = 02 3d 84 (in Hex) 

問題: - 現在,當我試圖將f32test = 40 3d 84 4d (in hex)二進制&然後回到浮動使用IEEE 754,我可以檢索2.9612。 雖然在我試圖轉換f24test = 02 3d 84 (in Hex)二進制&然後回到使用IEEE 754浮動,我不能檢索2.9612,而不是一些奇怪的價值。

我期待到這個wiki頁面引用有關浮點運算的 - :http://en.wikipedia.org/wiki/Single-precision_floating-point_format

我很困惑,爲什麼它不浮子24工作,如果我使用的是相同的格式爲1個符號位,8位指數& 15位尾數。 (在浮點數32是1符號位,8位指數& 23位尾數。)

可以讓你們任何一個人幫我從f24test = 02 3d 84 (in Hex)得到值2.9612 ???

請你,我一直在努力與這個過去15小時:(

預先感謝您:)

+0

您是否可以訪問任何關於恩智浦float24格式的文檔?我在網上找不到任何東西。但是,Pascal Cuoq解釋說,這個問題顯然與8位指數的編碼有關。 – TonyK 2014-11-14 13:51:34

+0

@TonyK是的...我有。由於它對我的項目保密,我不可能分享任何有關這方面的信息,但我希望我對帕斯卡爾·庫克的回覆能夠解釋一些事情。 :) – 2014-11-14 14:15:27

+0

除非您可以找到專門用於轉換該格式的轉換軟件,否則必須將其解構爲符號,偏向指數和分數。然後,您可以使用這些值進行算術運算以生成浮點數。 – 2014-11-14 15:54:49

回答

0

f32test = 40 3D 84 4D(十六進制)

f24test = 02 3d 84(十六進制)

在IEEE 754浮點格式中,浮點指數與bias一起存儲。很明顯,設計你所指的24位浮點格式的人沒有選擇使用與IEEE 754 binary32中使用的相同的偏置系統,因爲儘管存在以上兩個表示的指數位的值不匹配兩者的指數都用8位表示(根據您的情況)。

在32位表示,指數表示與該位0x80的,這聽起來約適合2和4之間的一個值的表示

你可以從假設開始,在指數24位格式的偏差爲0x04,並用更多的值確認。對於我們來說,單個值不足以理解不屬於IEEE 754標準的24位浮點格式,並且顯然設計有一些奇特的選擇。

+0

謝謝你的迴應。我知道在這種情況下,浮點數24對恩智浦(MRK II)非常具體,他們有自己的公式來計算它。希望即使對MRK III也有效。 – 2014-11-14 13:58:33

0

我想這是一個老帖子,但我會稱讚這跟我過,現在去體驗......

我也試圖發現恩智浦如何呈現float24數據類型。我正在編寫一個小的測試宏,它將被插入到一個更大的代碼段中,並且我嘗試使用float24數據類型,因爲常規的float數據類型似乎會導致問題(我是一名實習生,所以我不確定爲什麼這是造成問題,也許我寫代碼的目標不能支持32位浮點數?)。

有一些注意事項從一塊較大的代碼,指出像這樣的一些其他的工程師離開......

/* ByteValue[0] : mantissa bits m7..m0 
    ByteValue[1] : sign bit, mantissa bits m14..m8 
    ByteValue[2] : exponent e7..e0 (signed, 2s complement repres.) 
    Actual value is 
    f = s * (2^(-1) + m14 * 2^(-2) + ... m0 * 2^(-16)) * 2^e */ 

可悲的是,這種新的信息仍然是神祕的(什麼是假設是偏?假設有一個偏差嗎?變量's'是什麼?假設它是符號位,爲什麼它乘以尾數,因爲如果符號位是0,乘法可能意味着結果等於0,等等) 。

但是,這可能表明這個數字的結構是不同的。符號位不再是MSB,它在指數後面列出。這也意味着,在你的情況下,指數是+2(因爲你的十六進制數字以0x02開始,並且對應於ByteValue [2])。

我希望這可以幫助任何人絆倒這篇文章。我仍然試圖自己解決這個問題。請張貼任何新的想法。