十进制到浮点系统。

时间:2014-01-10 17:27:23

标签: math floating-point decimal computer-science hex

我被要求使用以下规范/规则处理以下问题...
数字从左到右分成16位,如下所示:
1位符号标志,应设置为负数,否则清除 超额63中持有7位指数 8位有效数,标准化为1.x,仅存储小数部分 - 如IEEE 754中所示 以十六进制给出答案,数字-18如何在此系统中表示?

得到的答案是:11000011 00100000(或十六进制的C320)
使用以下方法:
-18十进制是一个负数,所以我们将符号位设置为1 二进制的18将是0010010.这个我们可以记下为10010.我们知道小数点右侧的工作但是在这种情况下我们没有任何小数点或分数所以我们记下0000 0000因为那里没有分数。我们现在写下18的二进制和剩余的零(不一定是必需的)并用小数点分隔它们,如下所示:
10010.00000000
我们现在将其标准化为形式1.x,方法是移动小数点并将其放在第一个和第二个数字之间(计算我们移动小数点直到达到该区域的次数)。结果现在是1.001000000000 x 2 ^ 4,我们也知道小数点已被移动4次,现在我们将认为是我们的指数值。我们使用的浮点系统有7位指数并且使用超过63.指数超过63,等于63 + 4 = 67,这在7位二进制中显示为1000011。
符号位为:1(-ve)
指数为:1000011
重要的是00100 ...
二进制表示为:11000011 00100000(或十六进制的C320)

请告诉我这是否正确,或者我做错了,可以应用哪些更改。谢谢你:)

1 个答案:

答案 0 :(得分:1)

由于您似乎已经分配了许多此类问题,因此编写自动答案检查程序来验证您的工作可能会很有用。我在Python中组装了一个快速转换器:

def convert_from_system(x):

    #retrieve the first eight bits, and add a ninth bit to the left. This bit is the 1 in "1.x".
    significand = (x & 0b11111111) | 0b100000000
    #retrieve the next seven bits
    exponent = (x >> 8) & 0b1111111
    #retrieve the final bit, and determine the sign
    sign = -1 if x >> 15 else 1

    #add the excess exponent
    exponent = exponent - 63

    #multiply the significand by 2^8 to turn it from 1.xxxxxxxx into 1xxxxxxxx, then divide by 2^exponent to get back the decimal value.
    result = sign * (significand / float(2**(8-exponent)))
    return result

for value in [0x4268, 0xC320]:
    print "The decimal value of {} is {}".format(hex(value), convert_from_system(value))

结果:

The decimal value of 0x4268 is 11.25
The decimal value of 0xc320 is -18.0

这证实-18确实转换为0xC320。