将十进制转换为十六进制/二进制



我有小数学问题。

有没有办法将十进制数(例如 3.14)转换为十六进制或二进制?如果可能的话,任何人都可以在这里放置一些指向教程或扩展的链接吗? (我不想用某些语言,我一般在数学上需要它。请帮忙。

编辑

在代码中传递的输入:

0.1

ASM 代码中的输出:

415740h

另一个输入:

0.058

编译器的另一个输出:

00415748h

但是这是怎么做到的呢?如何转换?

我不承认您的输出样本是浮点数的编码或 .1 和 .058 的其他常见表示形式。我怀疑这些数字是汇编程序或编译器存储浮点编码的地址。

换句话说,您编写了一些包含浮点文本的文本,

汇编程序或编译器将该文本转换为浮点编码,将其存储在某个地址,然后将该地址放入从内存加载浮点编码的指令中。

这个假设与两个数字相差八的事实一致。由于双精度浮点数通常为 8 个字节,因此第二个地址 (0x415748) 比第一个地址 (0x415740) 高出 8 个字节。

在浮点数中编码数字的过程大致如下:

设 x 是要编码的数字。

如果 x 为正,则将 s(符号位)设置为 0,如果 x 为负,则设置为 1。将 x 设置为绝对值 x。

将 e(指数)设置为 0。重复以下任一适当的操作:

  • 如果 x 为 2 或更大,则将 1 加到 e 并将 x 除以 2。重复直到 x 小于 2。
  • 如果 x 小于 1,
  • 则将 -1 与 e 相加,然后将 x 乘以 2。重复直到 x 至少为 1。

完成上述操作后,x 至少为 1 且小于 2。此外,原始数等于 (-1)s·2e·x。也就是说,我们用符号位 (s) 和 2 的指数和 [1, 2) 中的有效数 (x) 表示数字(包括 1,不包括 2)。

设置f = (x-1)·252.将 f 舍入到最接近的整数(如果是两个整数之间的平局,则舍入为偶数)。如果 f 现在是 2 52,请将 f 设置为 0 并将 1 加到 e.(此步骤查找 x 在"小数点"之后紧接在"小数点"之后的 52 位 x,在第52位数字之后四舍五入,如果在该位置舍入 x 向上舍入为 2,它会调整指数, 这超出了我们想要的间隔。

将 1023 添加到 e。这在 x 方面没有数值意义;它只是浮点编码的一部分。解码时,减去 1023。

现在,将 s、e 和 f 转换为二进制数字,只使用 1 位数字表示 s,11 位数字表示 e,52 位数字表示 f。如有必要,包括前导零,以便 e 正好用 11 个二进制数字表示,f 用正好 52 个二进制数字表示。将这些数字连接起来,你就有 64 位。这是双精度浮点数的常见 IEEE 754 编码。

有一些特殊情况:如果原始数字为零,则对s,e和f使用零(s也可以为1,以表示特殊的"负零"。如果在添加 1023 之前,e 小于 -1022,则必须进行一些调整以获得"非正常"结果或零,我目前不进一步描述。如果在添加 1023 之前,e 大于 1023,则数字的大小太大,无法用浮点数表示。它可以被编码为无穷大,通过将 e(添加 1023 后)设置为 2047,将 f 设置为零。

十进制到浮点数:http://sandbox.mc.edu/~bennet/cs110/flt/dtof.html

最新更新