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

VDSP (BF561) 浮點運算系列(11):fract16 與 float 相互轉換詳解

     編輯:關於C++

VDSP 提供 float_to_fr16 與 fr16_to_float 兩個轉換函數,均為軟體模擬,非單週期指令。

float_to_fr16(float → fract16)

  • 演算法:先轉 fract32,再算術右移 16 位得 fract16。
  • 特殊值處理:
    • x >= 1.0 或 NaN/+Inf → 0x7FFF
    • x < -1.0 或 -NaN/-Inf → 0x8000
    • |x| < 3.05e-5 → 0
  • 週期數:範圍內 31、超範圍 30、輸入 0 為 28 cycles。
  • 精度損失:float 23 位尾數 → fract16 16 位,不可避免損失精度。

fr16_to_float(fract16 → float)

  • 演算法:將 fract16 視為 short 轉 float,再指數減 15 模擬除以 32768。
  • 無精度損失(小精度轉大精度)。
  • 週期數:輸入 0 為 22、其他 25 cycles。

常量賦值語法

編譯器支援後綴:fract16 r = 0.2r16; 自動編譯期轉為 0x1999。

隱性轉換陷阱

float r;
fract16 r1 = 0.2r16;
r = r1; // 錯誤!r 變為 6553 (0x1999 視為整數)

fract16 非內建型別(typedef short),編譯器**不會**自動插入轉換函數。所有運算、轉換必須顯式呼叫對應函數。

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