2012-08-13 18 views
7

我有一種情況,需要float以單個char表示。這個'minifloat'需要表示的範圍是0到10e-7,所以我們總是可以假設數字是+ ve,而指數-ve是爲了節省空間。在單個字節中表示浮點數

我考慮過的表示是3位指數和5位尾數(帶1位隱含位),指數以10爲底,即x = man * 10^exp

要從浮轉化爲我的minifloat,我打算使用frexp,並使用一些數學從基地2轉換爲基10

這是一個明智的做法?還是有更好的方法來實現這一目標?

回答

7

實際上你是否需要浮點數的值(即大致保持數值的精度)?你將如何處理這些值?

一個更簡單(更高效)的想法是將8位解釋爲隱式尺度爲1e-7的無符號定點數。即:

float toFloat(uint8_t x) { 
    return x/255.0e7; 
} 

uint8_t fromFloat(float x) { 
    if (x < 0) return 0; 
    if (x > 1e-7) return 255; 
    return 255.0e7 * x; // this truncates; add 0.5 to round instead 
} 
+0

這樣做的工作,謝謝! – Dunnie 2012-08-16 09:45:30

4

如果它符合您的目的,則可以使用格式作爲存儲或傳輸格式,即用於在狹小空間中記錄數據。您應該驗證這種格式的舍入誤差對於您的需求來說不是太大,範圍是否合適,等等。

這不是一個很好的計算格式,因爲它在正常硬件上會很慢。

我不明白你會做什麼基地轉換。如果在float中有一個IEEE-754浮點數,則轉換爲或轉換爲8位格式的工作是在轉換爲較窄格式時調整有效位數(分數)並調整指數偏移,另外還處理特殊情況(非規範,溢出,NaN)。這隻涉及二進制算術,而不是十進制。另外,請注意,浮點數的小數部分的合適項是「fraction」或「significantand」(在IEEE-754標準中使用的術語)。 「尾數」是對數的小數部分。

0

5尾數位給你從1.00 32種不同的情況下,以9.00以最小步長大小0.25

1.00 1.25 1.50 1.75 2.00 8.75 .... 9.00

3個指數可以給你8種不同的情況10^0(即1)10^-2 10^-3 10^-4 ....最後10^-7

你的小數部分的錯誤是0.25。如果你的計算可以彌補這個錯誤,那麼你可以使用它。

3

另一種方法是使用256浮點數(或雙精度)的靜態數組,您可以根據自己的條件進行選擇。

然後轉換unsigned char - > float/double是微不足道的...

轉換float/double-> unsigned char是一個更多的參與(查找靜態數組中的最接近的浮點數);它將花費大約8次與天真二進制搜索算法的比較,但根據您選擇靜態數組中的值的方式,您可能會發現更好。

當然,操作將使用本地浮點/雙精度執行。