python如何表示小数_小数的定点表示(附python程序)

定点数表示法(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)

结果

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值