首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

VDSP (BF561) 浮點運算系列(15):VDSP 庫 fract16 除法函數的 Bug 分析

     編輯:關於C++

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 = -13108
  • 6553 >= -13108 為真,直接回傳 0x7FFF(飽和),實際應為 -0.5。

根因

fract16 為有符號 1.15 格式,轉 int 後符號位擴展,正負數大小比較失去原始定點數語意。需先取絕對值比較大小,再依符號位調整結果符號。

期待後續更新修正此 Bug。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved