浮点与定点的二进制存储
1、浮點(diǎn)數(shù)和定點(diǎn)數(shù)存儲(chǔ)
https://blog.csdn.net/niaolianjiulin/article/details/82764511
2、浮點(diǎn)轉(zhuǎn)定點(diǎn)
本篇主要介紹另外一種浮點(diǎn)轉(zhuǎn)定點(diǎn)的方式,并結(jié)合neon代碼進(jìn)行介紹(上面的浮點(diǎn)定點(diǎn)基礎(chǔ)最好先看,大佬忽略)
static inline uint32_t fp32_to_bits(float f) {union {float as_value;uint32_t as_bits;} fp32 = { f };return fp32.as_bits; } int main() {int32_t value[4] = {234,536,382,430};int32x4_t vacc0x0123 = vld1q_s32(value);float scale = 0.05434;const uint32_t scale_bits = fp32_to_bits(scale);/* Multiplier is in [0x40000000, 0x7FFFFF80] range */int32_t multiplier = (int32_t)(((scale_bits & UINT32_C(0x007FFFFF)) | UINT32_C(0x00800000))<<7 );assert(multiplier >= INT32_C(0x40000000));assert(multiplier <= INT32_C(0x7FFFFF80));/* Shift is in [0, 31] range */const int32_t shift = 127 + 31 - 32 - (fp32_to_bits(scale) >> 23);assert(shift >= 0);assert(shift < 32);int32_t right_shift = -shift;const int32x4_t vmultiplier = vld1q_dup_s32(&multiplier);vacc0x0123 = vqrdmulhq_s32(vacc0x0123, vmultiplier);const int32x4_t vright_shift = vld1q_dup_s32(&right_shift);const int32x4_t vzero_shift_mask = vreinterpretq_s32_u32(vceqq_s32(vright_shift, vmovq_n_s32(0)));vacc0x0123 = vsraq_n_s32(vacc0x0123, vbicq_s32(vacc0x0123, vzero_shift_mask), 31);vacc0x0123 = vrshlq_s32(vacc0x0123, vright_shift);int32_t result[4];vst1q_s32(result, vacc0x0123);printf("%f %f %f %f\n",(value[0]*scale),(value[1]*scale),(value[2]*scale),(value[3]*scale));printf("%d %d %d %d ",result[0],result[1],result[2],result[3]);return 0; }?
?
1)首先看fp32tobits函數(shù),巧妙利用聯(lián)合體公用內(nèi)存空間轉(zhuǎn)換float數(shù)據(jù)類型為uint32_t
等價(jià)于const uint32_t scale_bits = *(uint32_t*)(&float)
2)得到浮點(diǎn)的二進(jìn)制后,將有效位取出,并左移七位得到int32_t得到vmultiplier?
3)接下來(lái)就是比較費(fèi)解的一步,
就是const int32_t shift = 127+31-32-(fp32tobits(scale)>>23)
(fp32tobits(scale)>>23)比較好理解就是獲得符號(hào)位與基數(shù)位,即127+m (m為浮點(diǎn)的二進(jìn)制小數(shù)轉(zhuǎn)換為形式小數(shù)點(diǎn)的偏移數(shù)),
最后的結(jié)果是-m-1,范圍為0-31(這里因?yàn)閟cale必須<1,所以m的范圍為-32<=m<=-1)
4)最后用value 乘以vmultiplier在移位shift就可以得到最后結(jié)果,等價(jià)于value 乘以scale的四舍五入
總結(jié)
以上是生活随笔為你收集整理的浮点与定点的二进制存储的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: vs2015+opencv3.4安装及问
- 下一篇: 关于DRAM、SRAM、cache、cp