我有一个小数学问题。
有没有办法将十进制数(例如 3.14)转换为十六进制或二进制?如果可能的话,有人可以在这里放置一些教程或解释的链接吗?(我不希望它用于某种语言,我通常在数学中需要它。)请帮忙。
编辑:
在代码中传递的输入:
0.1
ASM 代码中的输出:
415740h
另一个输入:
0.058
编译器的另一个输出:
00415748h
但是这是怎么做到的呢?怎么可能转换?
我有一个小数学问题。
有没有办法将十进制数(例如 3.14)转换为十六进制或二进制?如果可能的话,有人可以在这里放置一些教程或解释的链接吗?(我不希望它用于某种语言,我通常在数学中需要它。)请帮忙。
编辑:
在代码中传递的输入:
0.1
ASM 代码中的输出:
415740h
另一个输入:
0.058
编译器的另一个输出:
00415748h
但是这是怎么做到的呢?怎么可能转换?
我不将您的输出样本识别为浮点数的编码或 .1 和 .058 的其他常见表示。我怀疑这些数字是汇编器或编译器存储浮点编码的地址。
换句话说,您编写了一些包含浮点文字的文本,汇编器或编译器将该文字转换为浮点编码,将其存储在某个地址,然后将该地址放入加载浮点的指令中 -从内存中点编码。
这一假设与这两个数字相差 8 的事实是一致的。由于双精度浮点数通常为 8 个字节,因此第二个地址 (0x415748) 比第一个地址 (0x415740) 多 8 个字节。
用浮点数对数字进行编码的过程大致是这样的:
令 x 为要编码的数字。
如果 x 为正,则将 s(符号位)设置为 0,如果 x 为负,则设置为 1。将 x 设置为 x 的绝对值。
将 e(指数)设置为 0。重复以下任何适当的操作:
完成上述操作后,x 至少为 1 且小于 2。此外,原始数等于 (-1) s ·2 e ·x。也就是说,我们用符号位 (s)、2 的指数 (e) 和有效位 (x) 来表示数字,它在 [1, 2) 中(包括 1,不包括 2)。
设置 f = (x-1)·2 52。将 f 舍入到最接近的整数(如果它是两个整数之间的平局,则舍入到偶数)。如果 f 现在是 2 52,则将 f 设置为 0 并将 e 加 1。(当 x 表示为二进制数字时,此步骤会查找“小数点”之后的 x 的 52 位,并在第 52 位之后四舍五入,如果在该位置四舍五入将 x 向上舍入 2,则它会调整指数,这超出了我们想要的区间。)
将 1023 添加到 e。这对于 x 没有数值意义;它只是浮点编码的一部分。解码时,减去 1023。
现在,将 s、e 和 f 转换为二进制数字,s 只使用一位数字,e 使用 11 位数字,f 使用 52 位数字。如有必要,包括前导零,以便 e 用 11 个二进制数字表示,f 用 52 个二进制数字表示。连接这些数字,你就有了 64 位。这是双精度浮点数的常见 IEEE 754 编码。
有一些特殊情况:如果原始数为零,则对 s、e 和 f 使用零。(s 也可以是 1,表示一个特殊的“负零”。如果在添加 1023 之前,e 小于 -1022,则必须进行一些调整以获得“非正规”结果或零,我没有此刻进一步描述。如果在加1023之前,e大于1023,那么数字的大小太大而无法用浮点数表示。可以通过设置e(加1023后)将其编码为无穷大到 2047 和 f 到零。