在二进制、十进制和十六进制中进行浮点数运算

4

我在阅读我的笔记时发现了以下内容:

For every real number there are various ways of representing
it in such a way. Therefore, computers fix two parameters (so
they do not need to be stored, and arithmetic is more
convenient):

- the base b (normally, it is 2, 10 or 16) and
- the position of the decimal (or binary) point (by normalising
the mantissa such that it satisfies 1/b ≤ m < 1)

Example: Normalised representations for r := 12.25 are,
- for b = 2, r = 1 × 0.110001 × 2^4,
- for b = 10, r = 1 × 0.1225 × 10^2 and,
- for b = 16, r = 1 × 0.C4 × 16^1.

如何计算十进制数12.25的二进制、十进制和十六进制浮点数?我不太确定讲师是如何得出b=2、b=10和b=16的答案的。

2个回答

5
从例子中看,你的讲师对“标准化”的定义似乎是将数字表示为+1或-1乘上某个x再乘以基数的整数次幂,其中x是小于1的最大值,使得乘积等于所表示的数字。另外,x用基数中的数字表示。
例如,在二进制中考虑12.25。暂时保持在十进制中,我们可以表示12.25为1×12.25×20或1×6.125×21或1×3.0625×22或1×1.53125×23或1×.765625×24或1×.3828125×25。在这些中,我们可以看到.765625是符合形式的最大值小于1的值。因此,我们将12.25表示为1×.765625×24。然后我们需要将.765625转换为二进制。
你可能在之前的课程中已经学过了,但我们可以这样做:将.765625乘以2(得到1.53125)并将整数部分(1)与小数部分(.53125)分离。将小数部分乘以2(1.0625)并再次分离(1和.0625)。重复新的小数部分(0和.125)。继续重复直到小数部分为零或者你想要的位数:0和.25、0和.5、1和0。列出你得到的整数:1 1 0 0 0 1。现在,你想要的二进制数是一个点后面跟着这些数字:.110001。因此,在你讲师定义的标准下,12.25在二进制中表示为1×.110001×24
找到正确的x值的规则可能是这样的:从指数0开始。如果x大于1,请将其除以基数并将指数加1。如果x小于1/base,请将其乘以基数并从指数中减去1。重复此过程,直到x在1/base和1之间(包括1/base但不包括1,因此如果x等于1/base,则停止)。
对于十进制的12.25:从指数0开始。将12.25除以10(得到1.225)并将指数增加1。再次除以(.1225)并将指数增加2。现在我们停止了,因为.1225在1/10和1之间。
对于16进制的12.25:从指数0开始。将12.25除以16(得到.765625)并将指数增加1。现在停止,因为.765625在1/16和1之间。
将 .765625 转换成十六进制:将 .765625 乘以 16 得到整数 12(数字 C)和小数 .25。将 .25 乘以 16 得到整数 4 和小数 0。小数为 0,因此停止。十六进制数是 .C4,因此完整形式为 1×.C4×21
有时候,人们会使用其他“标准化”的定义。通常情况下,我们不是将 x 调整为介于 1/base 和 1 之间,而是调整为介于 1 和 b 之间。

1
非常感谢你解释这个方法,Eric。 - Nishant Sharma

4
我们正在尝试在不进行规范化的情况下,用各种进制来表示数字12.25。
对于二进制:
   12    - > 1100
   0.25  - > .01  (1 * (1/2)^2)
so 12.25   = 1100.01

对于十六进制:

   12    - > C
   0.25  - > .4   (4 * (1/16)^1)
so 12.25   = C.4 

然后小数点会随着指数项而移动。希望这能帮到你。我猜这不是一个答案,因为我没有描述任何方法。所以这里有一些关于这个主题的MathForums讨论链接。二进制数的长除法二进制浮点小数Dr. Math关于进位的FAQ。我仍在寻找一份好的Base 16浮点除法指南。Base ConvertDigit Convert是可以处理浮点数的在线进制转换器。这些网站使用JavaScript,因此可能可以获得正在使用的算法。

这太棒了。我现在有点明白了。你是怎么算出0.25的b=10和b=16的呢? - methuselah
我不明白你的问题,Methusaleh。 - Nishant Sharma
你是在问关于 b=2(二进制)和 b=16(十六进制)的吗? - Nishant Sharma
如何将十进制数0.25转换为十六进制? - methuselah
我很难表达这个问题,但小数点后的数字是一个分数的分子,其中分母是基数的幂。所以0.25 = 25/100(十进制)= 1/4 = 4/16 = 0.4(十六进制)。 - Nishant Sharma
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接