Python之浮点型

2023-11-03

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位数验证地址

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python之浮点型 的相关文章

随机推荐

  • 二进制应用

    一 什么是二进制 逢二进一的计数规则 规律 数字 0 1 进位基权 2 权 8 4 2 1 基数的幂次 二 为什么要用二进制 成本最优的解决方案 三 如何用二进制 3 1二进制与十进制的转换 3 1 1 十进制转二进制 方法为 十进制数除2
  • 写之前的项目关于使用git remote -v 找不到项目地址的解决方案

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 一 报错解析 1 报错内容 2 报错翻译 3 报错解析 1 使用git branch来查看git仓库有几个分支 2 使用git remote v 3 查看根目录的g
  • Wireshark 实验

    Wireshark 实验 Wireshark 实验 数据链路层 实作一 熟悉 Ethernet 帧结构 实作二 了解子网内 外通信时的 MAC 地址 实作三 掌握 ARP 解析过程 网络层 实作一 熟悉 IP 包结构 实作二 IP 包的分段
  • matlab arma 仿真,基于Matlab的ARMA模型时间序列分析法仿真

    自适应滤波器设计等等 基于Matlab的ARMA模型时间序列分析法仿真 ARMA模型时间序列分析法简称为时序分析法 是一种利用参数模型对有序随机振动响应数据进行处理 从而进行模态参数识别的方法 参数模型包括AR自回归模型 MA滑动平均模型和
  • llvm编译linux,在Linux上编译LLVM/Clang 8.0.0等全部源代码

    本教程使用的操作系统是Ubuntu Linux 18 04 2 LTS版本 编译器是GCC 6 5 0 不用新版的原因是某些代码不支持更高的版本 要编译的LLVM源代码是8 0 0 1 安装必要的软件 它们是 build essential
  • 使用mediapipe训练手指数字识别

    mediapipe手指数字识别 本文是从0开始创建一个识别手势的机器学习模型 为了识别手势 采用mediapipe模型 这个模型会返回手指的位置 之后再通过训练一个模型将这些位置分类得到手势 一 导入依赖 import cv2 import
  • js中的var详解

    var是js的一个关键字 它是用来声明变量的 声明一个变量有两种方式 第一种 var num 1 如果在方法中声明 则为局部变量 如果在全局中声明 则为全局变量 第二种 num 1 事实上这是对属性进行赋值操作 首先 它会尝试在当前作用域链
  • 操作符浅解

    1 移位操作符 作用的对象是数的二进制位 1 gt gt 向左边移动一位 左边丢弃 右边补0 相当于这个数乘以2移动n位 相当于乘以2的n次方 int main int a 2 int b a lt lt 1 打a的二进制向左移动一位 pr
  • vulnhub靶机练习-Me and My Girlfriend: 1

    vulnhub靶机练习 Me and My Girlfriend 1 靶机下载地址 https www vulnhub com entry me and my girlfriend 1 409 点击直接下载 靶机介绍 Description
  • 安达发

    APS Advanced Planning and Scheduling 先进计划与排程 是一种集成了生产计划 物料需求计划 MRP 库存控制和车间调度等功能的管理系统 在制造业中 物料清单 BOM 管理是APS系统中的一个重要组成部分 它
  • 电脑显示DNS服务器没检测到,连网时出现"该设备或资源(DNS 服务器)没有检测到有响应",怎么办?...

    连网时出现 该设备或资源 DNS 服务器 没有检测到有响应 怎么办 卡饭网 梦在深巷 2016 05 05 11 23 15 小编整理了以下2种解决方法大家可以参考以下 方法一 有可能是由于无线网络连接里面的DNS服务器错误 导致的网卡断网
  • 自动化遍历-appcrawler

    下载appclawler 下载地址 https pan baidu com s 1dE0JDCH list path 2F 查看帮助文档 java jar appcrawler 2 4 0 jar with dependencies jar
  • JS-ES6类

    使用js的class需注意以下几点 1 通过class关键字创建类 类名我们还是习惯性定义首字母大写 2 类里面有个constructor函数 可以接受传递过来的参数 同时返回实例对象 3 constructor 函数只要new生成实例时
  • seq2seq

    我的书 淘宝购买链接 当当购买链接 京东购买链接 seq2seq是通用编码器 解码器框架 encoder decoder framework 可以用在机器翻译 文本摘要 会话建模 图像描述 源码 https github com googl
  • 【编译原理】flex实现词法分析器

    flex自动实现词法分析器 FLEX 与 BISON 的使用 FLEX介绍 Flex是一个生成词法分析器的工具 它可以利用正则表达式来生成匹配相应字符串的C语言代码 其语法格式基本同Lex相同 单词的描述称为模式 Lexical Patte
  • 项目中好用的方法

    1 过滤 数组子项是对象的 对象有重复的 let arr res data filter function item index self return self findIndex el gt el applyPerson item ap
  • jsp 不能识别 el 表达式 的解决方法

    在以前使用EL表达式的时候 在JSP页面直接使用就可以了 但昨天我在做项目的时候在JSP页面上的EL表达式不能被识别 如 loginForm username 在页面上还是显示 loginForm username 后来我在JSP头上加上红
  • java面向对象----封装 && 构造器

    目录 封装和隐藏 为什么需要封装 信息的封装和隐藏 四种访问权限修饰符 构造器 构造方法 构造器的特征 语法格式 构造器重载 构造器重载举例 属性赋值过程 JavaBean UML类图 关键字 this this是什么 使用this 调用属
  • 抠图算法Background Matting:The world is your green screen

    论文地址 https arxiv org abs 2004 00626 代码 https github com senguptaumd Background Matting 背景介绍 抠图是照片编辑和视觉效果中使用的标准技术 在现有的抠图算
  • Python之浮点型

    python默认的是17位小数的精度 不支持32bit的单精度浮点数 如果程序需要精确控制区间和数字精度 可以考虑使用numpy扩展库 一 单精度和双精度的区别 内存不同 单精度浮点数占用4个字节 32位 存储空间 符号位1位 阶码8位 位