【问题标题】:How to convert to/from an 8-bit float representation?如何转换为/从 8 位浮点表示?
【发布时间】:2016-05-08 23:10:55
【问题描述】:

我目前正在为假设的 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)。

提前致谢!

编辑:我目前知道如何在理论上做到这一点 - 用 base-2 科学记数法和二进制表示形式编写它,但在我的程序中这样做需要使用字符串操作,而我宁愿将字符串中介排除在外它。

【问题讨论】:

  • 我不明白您是如何将 String 放入 的,也不知道您在编写代码时遇到的实际问题是什么。
  • 现在有点难以解释,因为我在手机上,但我已经介绍了字符串,因为我已经通过书面纸方法学会了这一点,即将十进制转换为二进制。 3.25 -> +11.01(我的字符串中介,因为我不知道如何用其他数据类型表示),然后移动浮点并将其转换为浮点格式。

标签: java floating-point type-conversion


【解决方案1】:

double 转换为浮点表示的基本计划应该是:

  1. 使用doubleToLongBitsdouble 转换为long。这给出了double 的 IEEE 754 表示。
  2. 通过对doubleToLongBits 结果使用位运算来提取double 的各个部分。第 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),用* 而不是+。)

有关double 格式的更多信息,请参阅https://en.wikipedia.org/wiki/IEEE_floating_point

【讨论】:

    猜你喜欢
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2012-05-25
    • 2011-11-17
    相关资源
    最近更新 更多