typescript實現byte存儲方式轉爲float


  private bytesToFloat(data: number[]): number {
    let num: number = data[0] | data[1] << 8 | data[2] << 16 | data[3] << 24;
    const s = num & 0x80000000;  //  Sign(1bit):表示浮點數是正數還是負數。0表示正數,1表示負數
    const e: number = ((num >> 23) & 0x0FF) - 127; //  Exponent(8bits):指數部分。類似於科學技術法中的M*10^N中的N,只不過這裏是以2爲底數而不是10。
    //  需要注意的是,這部分中是以2^7-1即127,也即01111111代表2^0,轉換時需要根據127作偏移調整。
    const m = num & 0x007FFFFF;  //  Mantissa(23bits):基數部分。浮點數具體數值的實際表示。

    //  還原float
    let ee: number = 0;
    let floatVal: number = 0;
    if (e == 0) { //  不需要移位
      let val: number = 0.5;
      for (let i = e + 1; i < 23; i++) {
        if (0x01 & (m >> (23 - i))) {
          val += this.getDiv(i - e);
        } else {
          val -= this.getDiv(i);
        }
      }
      floatVal = val;
    } else if (e > 0) { //  左移位

      //  計算整數部分值
      const rightCnt = 23 - e;
      ee = 1 << e | m >> rightCnt;

      //  計算後23位中小數部分值
      let val: number = 0.5;
      for (let i = e + 1; i < 23; i++) {
        if (0x01 & (m >> (23 - i))) {
          val += this.getDiv(i - e);
        } else {
          val -= this.getDiv(i);
        }
      }

      //  todo 暫時不加小數點後面值
      floatVal = ee;
      // floatVal = ee+val;
    } else { //  右移位
      ee = 1 >> (-1 * e);
      //  todo 負數暫時用不到 不實現
    }

    if (s == 0) {
      return floatVal;
    } else {
      return -1 * floatVal;
    }
  }

  private getDiv(cnt: number) {
    let val = 1;
    for (let i = 0; i < cnt; i++) {
      val = 2 * val;
    }
    return 0.5 / val;
  }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章