請讓我知道如何將32位浮點數轉換爲24位標準化值?我試圖爲(單位*(1 < < 24),但似乎並不奏效。請幫助我。謝謝。C/C++ - 將32位浮點值轉換爲24位標準化的定點值?
回答
當然它不工作,(1 < < 24)過大對於能夠代表存儲的24位數字,正好。爲了把這個另一種方式,1 << 24
實際上是一個25位數。
考慮(units * ((1 << 24) - 1))
代替。
(1 << 24) - 1
是最大的值的無符號24位整數,開始於可以代表。
現在,在範圍內的浮點數[0.0 - 1.0]將實際裝配到無溢出一個無符號的24位定點整數。
歸一化的定點表示意味着最大可表示值(不可嚴格可達)爲1.因此1表示爲1<<24
。另見Q Formats。例如Q24表示24個小數位,0個整數位和無符號。如果使用32位無符號整數來管理Q24,則可以使用剩餘8位來簡化計算。
在從浮點轉換爲定點表示之前,您必須始終爲原始值定義範圍。例如:浮點值是從[0, 5)
範圍內的物理值,所以0被包括和5不被包括在範圍內,並且您的定點值是歸一化至5
#include <string.h>
#include <stdio.h>
float length_flp = 4.5; // Units: meters. Range: [0,5)
float time_flp = 1.2; // Seconds. Range: [0,2)
float speed_flp = 1.2; // m/sec. Range: [0,2.5)
unsigned uint32_t length_fixp; // Meters. Representation: Q24 = 24 bit normalized to MAX_LENGTH=5
unsigned uint32_t time_fixp; // Seconds. Representation: Q24 = 24 bit normalized to MAX_TIME=2
unsigned uint32_t speed_fixp; // m/sec. Repr: Q24 = 24 bit normalized to MAX_SPEED=(MAX_LENGTH/MAX_TIME)=2.5
void main(void)
{
printf("length_flp=%f m\n", length_flp);
printf("time_flp=%f sec\n", time_flp);
printf("speed_flp=%f m/sec\n\n", length_flp/time_flp);
length_fixp = (length_flp/5) * (1 << 24);
time_fixp = (time_flp/2) * (1 << 24);
speed_fixp = (length_fixp/(time_fixp >> 12)) << 12;
printf("length_fixp=%d m\n", length_fixp);
printf("time_fixp=%d sec\n", time_fixp);
printf("speed_fixp = %d msec [fixed-point] = %f msec\n", speed_fixp, (float)speed_fixp/(1 << 24) * 2.5);
}
與優點規範化的表示是標準化值之間的操作返回規範化的值。 順便說一下,您必須爲每個操作(除法,乘法等)定義一個通用函數,以防止溢出並節省精度。 正如你所看到的,我用一個小技巧來計算speed_fixp
。 輸出是
length_flp=4.500000 m
time_flp=1.200000 sec
speed_flp=3.750000 m/sec
length_fixp = 15099494 m [fixed-point]
time_fixp = 10066330 sec [fixed-point]
speed_fixp = 25169920 msec [fixed-point] = 3.750610 msec
'x *(1 << 24)'是多餘的,它可以只是'(x)<< 24'。這是否是8:24或40:24格式,或者甚至可能在16位嵌入式系統上溢出也是模糊不清的。應該使用特定的類型,例如'uint32_t'或'uint64_t',並明確闡明(語義'typedef uint32_t uint_fixed_8_24_t')格式化特定變量在規範化之前使用*或昂貴的轉換爲double/float。 (另請參閱:[doom m_fixed.c](http://doomwiki.org/wiki/Doom_source_code_files),這在今天的編碼標準中幾乎不夠用)順便說一句:C缺省爲整數和雙精度。 – Barry
由於左操作數的浮點數,不能使用'x << 24'。我已經添加了有關定點類型的更多細節,但問題顯然是在談論24位標準化值。關於平臺獨立類型的使用是絕對正確的。 – omegatre
- 1. 將16位轉換爲32位浮點
- 2. 將十進制值轉換爲32位浮點十六進制
- 3. 將32位int值轉換爲浮點數
- 4. 在Java中將浮點轉換爲32位固定點
- 5. 將32位bmp轉換爲24位
- 6. 將浮點RGBA位圖轉換爲標準Dotnet位圖
- 7. 將32位浮點轉換爲16位PCM範圍
- 8. 將32位浮點數轉換爲IEEE 80位
- 9. 將int位轉換爲浮點位
- 10. IEEE浮點數轉換32位
- 11. 如何將4位浮點數轉換爲2位浮點數
- 12. 將一個32位浮點數轉換爲兩個16位浮點數,然後再轉換回該32位浮點數
- 13. 將UIColor轉換爲24位值
- 14. 將4位8位無符號整數轉換爲32位浮點型
- 15. 將二進制32位IEEE-754浮點數轉換爲.net
- 16. 將字典中的浮點值轉換爲兩位小數
- 17. Java中的24位到32位轉換
- 18. 將值轉換爲無符號32位
- 19. 如何將浮點數轉換爲int保留位值
- 20. 24位浮點指數
- 21. 將24位圖像轉換爲8位單點觸摸?
- 22. 將32位PNG文件轉換爲24位PNG文件
- 23. 浮點值轉換
- 24. 將字節轉換爲浮點值
- 25. 將浮點值轉換爲NSString
- 26. 將浮點值轉換爲NSString
- 27. 無法將值轉換爲浮點數
- 28. matlab中的32位十六進制到32位浮點(IEEE 754)轉換
- 29. 32位與64位浮點性能
- 30. 將小數位數多的浮點數轉換爲浮點數只有一個小數位的浮點數
你是什麼意思'24位標準化值'? – hivert
24位標準化無符號整數 – user1128265
因此,你認爲你的浮點數包含一個整數?如果'f = 3.14159265359',你的預期答案是什麼? – hivert