gpt4 book ai didi

java - 如何与 8 位浮点表示形式相互转换?

转载 作者:行者123 更新时间:2023-11-29 08:44:49 25 4
gpt4 key购买 nike

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

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

我目前已经弄清楚如何使用以下方法获取浮点字节的实际值:

FByte = SEEEEMMM

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

S = Sign bit
M = Mantissa
E = Exponent

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

提前致谢!

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

最佳答案

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

  1. 使用doubleToLongBitsdouble 转换为long .这给出了 double 的 IEEE 754 表示。
  2. 通过对 doubleToLongBits 结果使用位运算来提取 double 的部分。第 63 位是符号位。位 62-52 是偏置指数。位 51-0 是尾数。
  3. 尾数的高 3 位(原始 float 的第 51-49 位)将成为生成的 3 位尾数。 (两种格式都隐含 1。)但是,如果原始 float 的第 48 位为 1,则您必须决定如何处理舍入。如果第 51-49 位为 0b111,并且您决定你需要四舍五入,非常小心地编写你的代码,因为现在尾数从 [1].111[1]0.000,这意味着你将需要向右移动一个(得到 [1].000),这将影响结果指数。 (我使用 [1] 表示尾数中隐含的 1 位。)
  4. 要获得新的指数,取原来的偏置指数,减去 1023,然后加 7。1023 是 IEEE 754 double 的偏置,而 7 似乎是你的 float 偏置 -点类型。结果将是新的指数,但它可能超出范围。 [另外,如上所述,如果您四舍五入,您可能需要在新指数中再加 1。]
  5. 结果的符号位是原始double的符号位。 (我假设你的意思是公式是 (-1)^S * 1.M^(E-7),用 * 而不是 +.)

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

关于java - 如何与 8 位浮点表示形式相互转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37105764/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com