您正在寻找的答案是:
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 求解器非常了不起,他们可以做神奇的事情;包括免费转换为您可能拥有的任何特定浮点格式!