VDSP fract_math.h 提供內聯函數 div_s(fract16, fract16),邏輯與文檔範例一致,但存在嚴重缺陷:將 fract16 轉為 int 後直接比較大小,導致正數除以負數時錯誤飽和回傳最大值 0x7FFF。
static fract16 div_s(fract16 _a, fract16 _b) {
int x = (int)_a;
int y = (int)_b;
if (x == 0) return 0;
else if (x >= y) return 0x7FFF; // 錯誤:整數比較忽略符號
// ... 正常除法流程
}
計算 0.2 / -0.4:
0.2 → 0x1999 → int = 6553-0.4 → 0xCCCC → int = -131086553 >= -13108 為真,直接回傳 0x7FFF(飽和),實際應為 -0.5。fract16 為有符號 1.15 格式,轉 int 後符號位擴展,正負數大小比較失去原始定點數語意。需先取絕對值比較大小,再依符號位調整結果符號。
期待後續更新修正此 Bug。