在 C 語言中,fixed_t 通常是一個自定義的類型別名(typedef),用于表示固定點數(Fixed-Point Number),而非 C 語言標準庫中的原生類型。它主要用于需要高效實數運算但無法使用浮點數的場景(如嵌入式系統、性能敏感代碼)。
核心概念:固定點數(Fixed-Point)
原理
用整數類型(如 int32_t)表示實數,但隱含約定小數點位置。
例如:
若定義 小數部分占 16 位,則數值實際值 = 存儲值 / 21?
存儲值 0x00010000(65536)→ 實際值 1.0
存儲值 0x00018000(98304)→ 實際值 1.5
優勢
性能高:整數運算快于浮點運算(尤其無FPU硬件時)。
確定性:避免浮點精度誤差(適用于金融、嵌入式控制)。
內存小:通常用 16/32 位整數存儲,比 float/double 更緊湊。
劣勢
范圍/精度受限:需提前規劃整數/小數部分的位數。
手動處理縮放:乘除需顯式移位調整小數點位置。
#include <stdint.h>
// 常見定義方式:32位整數,其中16位表示小數部分(Q16.16格式)
typedef int32_t fixed_t;
#define FIXED_SHIFT 16 // 小數部分位數
// 輔助宏(可選)
#define INT_TO_FIXED(x) ((fixed_t)((x) << FIXED_SHIFT)) // 整數轉固定點
#define FIXED_TO_INT(x) ((x) >> FIXED_SHIFT) // 固定點取整數部分
#define FLOAT_TO_FIXED(x) ((fixed_t)((x) * (1 << FIXED_SHIFT))) // 浮點轉固定點
#define FIXED_TO_FLOAT(x) ((float)(x) / (1 << FIXED_SHIFT)) // 固定點轉浮點
// 加法(直接整數相加)
fixed_t a = FLOAT_TO_FIXED(1.5); // a = 0x00018000
fixed_t b = FLOAT_TO_FIXED(2.25); // b = 0x00024000
fixed_t sum = a + b; // sum = 0x0003C000 → 3.75
// 乘法(需移位調整)
fixed_t multiply(fixed_t x, fixed_t y) {
int64_t tmp = (int64_t)x * y; // 防溢出
return (fixed_t)(tmp >> FIXED_SHIFT); // 右移去除多余小數位
}