Python之浮点型

python默认的是17位小数的精度,不支持32bit的单精度浮点数,如果程序需要精确控制区间和数字精度,可以考虑使用numpy扩展库

一、单精度和双精度的区别

  1. 内存不同
    单精度浮点数占用4个字节(32位)存储空间,符号位1位,阶码8位,位数23位。
    双精度浮点数使用8个字节(64位)存储空间来存储一个浮点数,包括符号位1位,阶码11位,尾数52位。

  2. 所存的数值范围不同
    单精度浮点数的数据范围-3.4E38到3.4E38,双精度浮点数可以表示的数字绝对值范围大约为-2.23E308到1.79E308

  3. 十进制下的位数不同
    单精度浮点数最多有7位十进制有效数据,如果有效数字超过7位,还定义为单精度变量时,超出部分会自动四舍五入
    双精度浮点数可以表示十进制的15或16位有效数字,超出的部分也会自动四舍五入。

二、扩展知识

在计算机中表示一个浮点数,其结构如下:
尾数部分(定点小数) 阶码部分(定点整数)
阶符(±)  阶码e  数符(±)  尾数m
  1. 阶符:阶码的符号。
  2. 阶码:在机器中表示一个浮点数时需要给出指数,这个指数用整数形式表示,这个整数叫做阶码。
  3. 数符:数学符号,浮点表示数据格式的一个关键词。
  4. 尾数:小数点后面的数字。
  5. 一个浮点数a由两个数m和e来表示:a = m × b^e。
    在任意一个这样的系统中,我们选择一个基数b(记数系统的基)和精度p(即使用多少位来存储)。
  6. m(即尾数)是形如±d.ddd…ddd的p位数(每一位是一个介于0到b-1之间的整数,包括0和b-1)。
    如果m的第一位是非0整数,m称作规格化的。
  7. 有一些描述使用一个单独的符号位(s 代表+或者-)来表示正负,这样m必须是正的。e是指数。

要求超过17位的精度分析,使用decimal模块

from decimal import *

# 详细参数的含义可以在网上查
print(getcontext())
# Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow])


##########################
##########################
##此参数只在计算或者字符的时候生效##
##########################
##########################
getcontext().prec=30 # 通过设置这个参数来设置浮点数的有效数字位数(有效位数指的是小数点前不为0的数字个数+小数点后的数字)

print(type(0.123))
a=0.12345678901234567890123456
b=1.123456789012345678901234561111111111111111111111111111111111111111111111111111111111111
print(a)
print(b)
print(Decimal(b))
# 输出:a=0.12345678901234568
# 输出:b=1.1234567890123457
# 输出:Decimal(b)=1.123456789012345691247674039914272725582122802734375
getcontext().prec=30
print(Decimal(70)/Decimal(9)) # 7.77777777777777777777777777778
print(Decimal(7)/Decimal(9)) # 0.777777777777777777777777777778

三、小练习

需求:求出π小数点后任意一位

'''
π是圆的周长与直径的比值
理论知识:马青公式,是通过正切来计算的,具体的方法可以在网上查,推导过程很容易理解 详细:https://www.bilibili.com/read/cv2940966/
反正切函数的加法公式 arctan A + arctan B=arctan((A+B)/(1-AB)
反正切函数的减法公式 arctan A - arctan B=arctan(A-B)/(1+AB)
马青公式:π=16arctan(1/5)-4arctan(1/239)
即π = 16(1/5 - 1/3/5^3 + 1/5/5^5 - ...) - 4(1/239 - 1/3/239^3 + 1/5/239^5 - ...)
'''

def caculate_pi(n):
    '''
    计算pi到小数点后任意一位
    // 是Python中数学运算符: 整除(向小取整)
    :param n: 
    :return: 
    '''
    # n=10
    number1 = n+10 # number1=20
    b = 10**number1 # b=10^20次方
    x1 = b*4//5 # 求含4/5的首项
    x2 = b// -239 # 求含1/239的首项
    he = x1+x2 # 求第一大项
    n *= 2 #设置下面循环的终点,即共计算n项
    #循环初值=3,末值2n,步长=2
    for i in range(3,n,2):
        x1 //= -25 # 求每个含1/5的项及符号
        x2 //= -57121 # 求每个含1/239的项及符号
        x = (x1+x2) // i # 求两项之和
        he += x # 求总和
    pai = he*4 # 求出π
    pai //= 10**10 #舍掉后十位
    ############ 输出圆周率π的值
    paistring=str(pai)
    result=paistring[0]+str('.')+paistring[1:len(paistring)]
    return result

for i in range(10,100,10):
	print('计算π后%i位' % i,caculate_pi(i))

#计算π后10位 3.1415926535
#计算π后20位 3.14159265358979323846
#计算π后30位 3.141592653589793238462643383279
#计算π后40位 3.1415926535897932384626433832795028841971
#计算π后50位 3.14159265358979323846264338327950288419716939937510
#计算π后60位 3.141592653589793238462643383279502884197169399375105820974944
#计算π后70位 3.1415926535897932384626433832795028841971693993751058209749445923078164
#计算π后80位 3.14159265358979323846264338327950288419716939937510582097494459230781640628620899
#计算π后90位 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825

π的后n位数验证地址

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

两个猫崽子和你

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值