如何转换为8位浮点表示?

时间:2016-05-08 23:10:56

标签: java floating-point type-conversion

我目前正在为假想的CPU创建一个模拟器。 CPU有16个8位寄存器,可以表示有符号字节或8位浮点数。

SByte和FByte都包含一个字节成员变量。

我目前已经研究了如何使用以下方法获取浮动字节的实际值:

FByte = SEEEEMMM

value = (-1)^S + 1.M^(E-7)

S = Sign bit
M = Mantissa
E = Exponent

我如何将给定的双精度值(例如-3.562)转换为浮点表示形式(如SEEEEMMM)。

提前致谢!

编辑:我目前知道如何在理论上做到这一点 - 用基础2科学记法和二进制表示法写它,但是在我的程序中这样做需要使用字符串操作,而我宁愿保留字符串中介出来的。

1 个答案:

答案 0 :(得分:4)

double转换为浮动表示的基本计划应为:

  1. 使用doubleToLongBitsdouble转换为long。这给出了double的IEEE 754表示。
  2. 使用double结果上的位操作提取doubleToLongBits的部分。位63是符号位。位62-52是偏置指数。比特51-0是尾数。
  3. 尾数的高3位(原始浮点数的第51-49位)将成为您产生的3位尾数。 (两种格式都有隐含的1。)但是,如果原始浮点数的第48位为1,则必须决定如何处理舍入。如果第51-49位是0b111并且您决定需要要整理,仔细编写代码,因为现在尾数从[1].111变为[1]0.000,这意味着你需要向右移一(获得[1].000),会影响最终的指数。 (我使用[1]表示尾数中隐含的1位。)
  4. 要获得新的指数,请取原始偏差指数,减去1023,然后加上7. 1023是IEEE 754 double的偏差,7似乎是浮点类型的偏差。结果将是新的指数,但它可能超出范围。 [另外,如果你向上舍入,你可能不得不向新指数添加另一个1,如上所述。]
  5. 结果的符号位是原始double的符号位。 (我假设您的公式为(-1)^S * 1.M^(E-7),而*代替+。)
  6. 有关double的格式的详细信息,请参阅https://en.wikipedia.org/wiki/IEEE_floating_point