定点数表示法(fixed-point)
所谓定点格式,即约定机器中所有数据的小数点位置是固定不变的。在计算机中通常采用两种简单的约定:将小数点的位置固定在数据的最高位之前,或者是固定在最低位之后。一般常称前者为定点小数,后者为定点整数。
定点小数是纯小数,约定的小数点位置在符号位之后、有效数值部分最高位之前。若数据 $x$ 的形式为 $x = x_0 x_1x_2 … x_n$ ( 其中$x_0$为符号位,$x_1~x_n$ 是数值的有效部分,也称为尾数,$x_1$为最高有效位 ),则在计算机中的表示形式为:
一般说来,如果最末位 $x_n = 1$,前面各位都为 0,则数的绝对值最小,即 $|x|_{min}=2^{-n}$ 。如果各位均为 1,则数的绝对值最大,即 $|x|_{max} =1-2^{-n}$ 。所以定点小数的表示范围是: $$2^{-n} ≤ |x| ≤ 1-2^{-n}$$
定点整数是纯整数,约定的小数点位置在有效数值部分最低位之后。若数据 $x$ 的形式为 $x = x_0 x_1x_2 … x_n$ (其中 $x_0$ 为符号位,$x_1~x_n$ 是尾数, $x_n$为最低有效位 ),则在计算机中的表示形式为:
定点整数的表示范围是:
$$1 ≤ |x| ≤ 2^{n} - 1$$
当数据小于定点数能表示的最小值时,计算机将它们作 0 处理,称为下溢;大于定点数能表示的最大值时,计算机将无法表示,称为上溢,上溢和下溢统称为溢出。
计算机采用定点数表示时,对于既有整数又有小数的原始数据,需要设定一个比例因子,数据按其缩小成定点小数或扩大成定点整数再参加运算,运算结果,根据比例因子,还原成实际数值。若比例因子选择不当,往往会使运算结果产生溢出或降低数据的有效精度。
定点数权值:
位值:
...
3
2
1
0
-1
-2
-3
-4
...
权值:
...
8
4
2
1
0.5
0.25
0.125
0.0625
...
Python程序
#!/usr/bin/env python
import re
import sys
def read_number():
s = input("Please input the number you want to convert (.eg 0.299): ")
m1 = re.match("(0|[1-9]+)\.[0-9]+",s)
if m1 is not None:
print("The number you input is: ", s)
n = input("Please input the precision(.eg 10): ")
m2 = re.match("[0-9]+",n)
if m2 is not None:
print("The precision you input is: ", n)
return s,n
else:
print("Please input the correct precision")
sys.exit()
else:
print("Please input the correct decimal number")
sys.exit()
def decimal2point(s,n):
decimal2bin = ""
integer, decimal = s.split(".")
decimal = float('0.'+ decimal)
integer2bin = bin(int(integer,10)).replace('0b','')
for i in range(int(n)):
decimal = decimal * 2.0
if(decimal >= 1.0):
decimal2bin = decimal2bin + '1'
decimal = decimal - 1;
else:
decimal2bin = decimal2bin + '0'
print ("")
print ("Out(binary):")
print (integer2bin+'.'+decimal2bin)
print ("Out(integer):")
if (integer == "0"):
print (str(int(decimal2bin,2))+"/"+str(2**int(n)))
else:
print (str(int(integer2bin,2))+"┐"+str(int(decimal2bin,2))+"/"+str(2**int(n)))
if __name__ == '__main__':
s,n = read_number()
decimal2point(s,n)
结果