python定点数 | 您所在的位置:网站首页 › 名剑求瑕 › python定点数 |
任务描述 背景 第 1 关提到,二进制中除了 0 和 1,还有 +、− 和 .,而计算机底层只有 0 和 1。之前关卡解决的是如何用 0 和 1 表示正负号的问题,从本关开始要进一步解决小数点的问题。 问题的难点在于不能直接用 0 和 1 表示小数点这个符号。例如,若用 1 表示小数点,则二进制数 101.01 对应的表示为 101101,计算机无法区分哪个 1 是小数点,用 0 或其它 01 串表示都存在类似问题。 解决方法是固定小数点的位置。例如,可以做如下规定,在 8 位原码中,小数点位置总是在第 4 位和第 5 位之间,固定不变,则 01010100 表示的数是 +101.0100,即 101.01,从而不用再直接表示小数点了,因为它的位置是已知的。这种表示方式叫定点数。 在实际使用时,一般将小数点位置固定在以下两个位置: 1)数字部分之后,如 8 位原码 00000001 表示的是 +0000001.,即 +1,这种方式叫定点整数,之前关卡介绍的其实都是定点整数; 2)符号位之后、数字部分之前,如 8 位原码 00000001 表示的是 +.0000001,即 +0.0000001,这种方式叫定点小数,定点小数可以表示纯小数。 你可能会问,那 00000001 表示的到底是 +1 还是 +0.0000001,计算机如何区分它是定点整数还是定点小数?其实计算机无法区分,需要提前告诉计算机,这个数采用的是哪种表示方式,计算机才能正确处理。 定点整数在之前关卡已经介绍,本关主要涉及定点小数。将一个纯小数转换成定点小数过程与第 1 关类似:转换符号位、填入数字部分、补 0,但补 0 位置是在数字部分最后。例如,−0.101 转换为 8 位定点小数,过程如下: 测试说明 例如,测试集 1 的输入为(真实值): -0.101测试集 1 的输出为(真实值->原码形式定点小数->补码形式定点小数): -0.101 -> 11010000 -> 10110000开始你的任务吧,祝你成功! import myCoding N = 8 #位数为8 ########## Begin ########## def ZhenToDing_point(z): zl = [i for i in z] if zl[0] == '-': zl[0] = '1' zl.pop(1) elif zl[0] == '+': zl[0] = '0' zl.pop(1) else: # 无符号正数 pass zl.pop(zl.index('.')) for i in range(N-len(zl)): zl.append('0') return ''.join(zl) ########## End ########## z = input() #真实值 y = ZhenToDing_point(z) #求定点小数(原码形式) b = myCoding.YuanToBu(y)#求定点小数(补码形式) print('%s -> %s -> %s' % (z, y, b)) |
CopyRight 2018-2019 实验室设备网 版权所有 |