我有一種情況,需要float
以單個char
表示。這個'minifloat'需要表示的範圍是0到10e-7,所以我們總是可以假設數字是+ ve,而指數-ve是爲了節省空間。在單個字節中表示浮點數
我考慮過的表示是3位指數和5位尾數(帶1位隱含位),指數以10爲底,即x = man * 10^exp
。
要從浮轉化爲我的minifloat,我打算使用frexp
,並使用一些數學從基地2轉換爲基10
這是一個明智的做法?還是有更好的方法來實現這一目標?
我有一種情況,需要float
以單個char
表示。這個'minifloat'需要表示的範圍是0到10e-7,所以我們總是可以假設數字是+ ve,而指數-ve是爲了節省空間。在單個字節中表示浮點數
我考慮過的表示是3位指數和5位尾數(帶1位隱含位),指數以10爲底,即x = man * 10^exp
。
要從浮轉化爲我的minifloat,我打算使用frexp
,並使用一些數學從基地2轉換爲基10
這是一個明智的做法?還是有更好的方法來實現這一目標?
實際上你是否需要浮點數的值(即大致保持數值的精度)?你將如何處理這些值?
一個更簡單(更高效)的想法是將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
}
如果它符合您的目的,則可以使用格式作爲存儲或傳輸格式,即用於在狹小空間中記錄數據。您應該驗證這種格式的舍入誤差對於您的需求來說不是太大,範圍是否合適,等等。
這不是一個很好的計算格式,因爲它在正常硬件上會很慢。
我不明白你會做什麼基地轉換。如果在float
中有一個IEEE-754浮點數,則轉換爲或轉換爲8位格式的工作是在轉換爲較窄格式時調整有效位數(分數)並調整指數偏移,另外還處理特殊情況(非規範,溢出,NaN)。這隻涉及二進制算術,而不是十進制。另外,請注意,浮點數的小數部分的合適項是「fraction」或「significantand」(在IEEE-754標準中使用的術語)。 「尾數」是對數的小數部分。
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。如果你的計算可以彌補這個錯誤,那麼你可以使用它。
另一種方法是使用256浮點數(或雙精度)的靜態數組,您可以根據自己的條件進行選擇。
然後轉換unsigned char - > float/double是微不足道的...
轉換float/double-> unsigned char是一個更多的參與(查找靜態數組中的最接近的浮點數);它將花費大約8次與天真二進制搜索算法的比較,但根據您選擇靜態數組中的值的方式,您可能會發現更好。
當然,操作將使用本地浮點/雙精度執行。
這樣做的工作,謝謝! – Dunnie 2012-08-16 09:45:30