OP的請求很可能有些錯誤。
-1.0 --> 0x00800000
-0.5 --> 0x00C00000
-0.25 --> 0x00E00000
0.0 --> 0x00000000
+0.25 --> 0x00200000
+0.5 --> 0x00400000
+1.0 --> 0x007FFFFF ???
這最後一個數據點更可能應該
(+1.0 - pow(2,-23)) --> 0x007FFFFF
假定輸入是float
,輸出需要24位int或更好,所以使用long
(int
可能只是16位)
#include <math.h>
long convert(float value) {
return (long) roundf(value * 0x800000);
}
或者並且不可攜帶的,可以添加3.0將輸入放在範圍[2.0到4。0)並將這些比特從聯合中拉出來。
uint32_ t convert2(float value) {
union {
uint32_t i;
float f;
} x;
x.f = value + 3.0f;
return (x.i - 0x00800000) & 0x00FFFFFF;
}
返回類型可能是int24_t
你有它。 (在嵌入式世界中並不罕見)。
您可能想要提及您需要的確切24位格式。至少我不清楚24位值(簽名數據)。 – 2014-11-03 05:29:38
如果你想表達範圍(-1.0; 1.0),你可以將其轉換爲(0.0,2.0),然後乘以(2^23-1)並將其轉換爲整數(你可以在前面舍入)。爲了轉換回你分開它然後減去1.0。請注意,它肯定會失去精確度。 – qwr 2014-11-03 06:00:15
你爲什麼需要這個?但是你可以閱讀[this](http://stackoverflow.com/questions/7416699/how-to-define-24bit-data-type-in-c) – 2014-11-03 07:11:51