【问题标题】:How to convert floating number to binary if I have no 32 bits for it如果我没有 32 位,如何将浮点数转换为二进制
【发布时间】:2019-06-04 11:22:42
【问题描述】:

我正在尝试将小数 1,76 转换为二进制,但指数的大小不是 8 位,而是 3 位,尾数的大小不是 23 位,而是 6 位。也就是说,只有 10 位。

我得到 32 位表示 0 01111111 11000010..... 我可以剪掉这个表示吗?

谢谢。

【问题讨论】:

  • 您必须有一个精确的格式规范,并且对于 10 位浮点数没有标准表示(并且您可能有第 11 位作为符号)。指数是如何编码的(如果遵循 ieee754 逻辑,可能是 exp+3)?有没有隐藏的地方?当您拥有此信息时,如果格式类似于 ieee754,您将必须 1/ 调整指数和 2/ 将尾数截断(或最好舍入)为 8 位。

标签: floating-point binary type-conversion


【解决方案1】:

您正在寻找的答案是:

0 011 110001

如果您只关心这些,您可以停止阅读;但是,如果您想了解我是如何找到它的以及 SMT 求解器如何帮助回答有关浮点数的此类问题(以及许多其他问题!),请继续阅读。

如果您有 3 个指数位、6 个有效位和 1 个符号位;那么你总共有 10 位。 Eric 已经解释了如何进行转换的一般模式,但他使用了 16 位所谓的half-precision 格式。由于您有这种非标准格式,它不会直接回答您的问题。你可以按照他的推理为你的格式做同样的事情(你必须弄清楚适当的偏见等),或者使用一个工具来为你做所有这些。

现代 SMT 求解器可轻松用于此类转换。 SMT 求解器是一种自动定理证明器,可以处理不同的感兴趣的理论,浮点就是其中之一。它们以最通用的方式支持浮点数:使用用户指定的指数和有效数宽度。

说了这么多,我们需要做的就是询问求解器,给定数字1.76,转换为您的特定格式是什么。以下是该问题在 SMT-Lib 语言中的编码方式:

(set-option :produce-models true)
(define-fun x () (_ FloatingPoint 3 7) 
                 ((_ to_fp 3 7) roundNearestTiesToEven (/ 176.0 100.0)))
(check-sat)
(get-value (x))

如您所见,它是一种类似 lisp 的语言。您正在谈论的浮点类型(有点令人困惑)写为(_ FloatingPoint 3 7)。这意味着我们有 3 位指数位和 7 位有效位,包括隐藏位。符号的额外 1 位始终存在,因此没有明确提及。

使用函数(_ to_fp 3 7) 完成转换,它将给定的自然转换为相应的格式。注意它像往常一样采用舍入模式,我选择了普通模式roundNearestTiesToEven;但您可以选择五种 IEEE754 舍入模式中的任何一种。有关详细信息,请参阅浮点逻辑描述。最后,有理数1.76写成(/ 176.0 100.0)

我们告诉求解器在第一行生成模型。电话(check-sat) 说:继续为我的所有约束找到一个模型。在最后一行,我们询问浮点数的值x

现在如果你把这个程序放在一个文件中,比如a.smt2,然后在你的电脑上下载z3并运行它,你会得到:

$ z3 a.smt2
sat
((x (fp #b0 #b011 #b110001)))

z3 告诉我们的是,确实有解决方案。 (请记住,您可以设置任意约束,因此系统通常可能没有解决方案;在这种情况下,您会得到unsat 的答案。)然后它告诉我们x 的值是什么。你可以眯着眼睛看你要求的格式:

0 011 110001

好了,这就是你在特定浮点格式中表示数字 1.76 的方式。

SMT 求解器非常了不起,他们可以做神奇的事情;包括免费转换为您可能拥有的任何特定浮点格式!

【讨论】:

  • 是的,我有“十位”卡在我的脑海中,并且错误地将其用于有效位字段。我修正了我的答案。
【解决方案2】:

此答案假定采用 IEEE-754 样式的 10 位格式:

  • 有一位符号字段,0 表示正,1 表示负。
  • 有一个指数偏差为 3 的三位指数字段(2e 在字段中用 e-3 表示)。
  • 有一个七位有效位,其中后六位存储在有效位域中,前导位由指数编码(指数域中的零表示前导有效位为0,非零表示1,不包括无穷大或 NaN)。

为了编码 1.76,我们观察到:

  • 为正数,符号位为0。
  • 它等于 f•20,其中 1 ≤ f e 为 0 .
  • f 是 1.76,即二进制 1.1100001010001111...

将有效位划分为一个前导位、六位用于有效位字段和余数,我们有 1 110000 1010001111...。由于余数大于前一位置值的 ½,我们向上取整,将 1 110000 递增到 1 110001。

因此,1.76的编码是符号0,指数3(011),有效位110001:

0 011 110001

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 2017-02-23
    • 2011-03-05
    • 1970-01-01
    相关资源
    最近更新 更多