fract16 採用 1.15 定點格式:1 位符號 + 15 位數值,無指數/尾數分離。
+0.999969482421875 (0x7FFF)-1.0 (0x8000)2^-15 = 0.000030517578125使用 fract 需先歸一化資料(浮點運算開銷大),僅當運算量遠大於歸一化開銷時才有優勢。文檔範例:兩 float 相乘用 fract 需 743 cycles,直接 float 乏法僅 92 cycles。
typedef short fract16; 非內建型別,除錯時需在寄存器視窗手動切換型別查看真值。
float:符號位獨立,0.2=0x3E4CCCCD,-0.2=0xBE4CCCCD(僅最高位不同)。fract16:補碼表示,0.2=0x1999,-0.2=0xE666,兩者相加為 0xFFFF。**不能**像 float 那樣單純翻轉最高位改變符號。
negate_fr1x16(x) → __builtin_negate_fr2x16((int)x)
// 組合語言:R1 = -R0 (V); R1 = R1.L (X);
直接整數取反(含飽和處理:0x8000 取反飽和為 0x7FFF)。