浮点数——科学计数法、浮点数表示、加减运算和浮点数的使用

2023-11-02

目录

1.2浮点数

1.2.1 科学计数法

1.2.2 浮点数表示

1 符号位

2价码位

1.2.3 加减运算

1.2.4 浮点数的使用

 

1.2浮点数

浮点数是采用科学计数法来表示的,由符号位、有效数字、指数三部分组成。使用浮点数存储和计算的场景无处不在,若使

用不当则容易造成计算与理论值不一致,如下示例代码。

float a = 1f;
float b = 0.9f;


// 结果为: 0.100000024
float f = a -b;

执行结果显示计算结果与预期存在明显得误差,下面我们来深入剖析造成这个误差的原因来介绍浮点数的构成与计算原理。由于浮点数是以科学计数法来表示的。

1.2.1 科学计数法

浮点数是计算机用来表示小数的一种数据类型。在数学中,采用科学计数法来近似表示一个极大或一个极小且位数较多的数。例如a × 10^{n},其中a满足1≤ |a| <10,10^{n}是以10为底数,n为指数的幂运算表达式。a × 10^{n}还可以表示成aen。

科学计数法的有效数字为从第一个非零数字开始的全部数字,指数决定小数点的位置,符号表示该数的正负。值得注意的是,十进制科学计数法要求有效数字的整数部分必须在[1, 9]区间内,满足这个要求的表示形式被称为“规格化”。科学计数法可以唯一地表示任何一个数,且所占用的存储空间会更少,计算机就是利用这一特性表示极大或极小的数值。例如长整型能表示的最大值约为922亿亿,想要表示更大量级的数值,必须使用浮点数才可以做到。

1.2.2 浮点数表示

浮点数表示就是如何用二进制数表示符号、指数和有效数字。当前业界流行的浮点数标准是IEEE754,该标准规定了4种浮点数类型:单精度、双精度、延伸单精度和延伸双精度。前两种类型是最常用的,它们的取值范围如表1-4所示。

表 1-4 单精度和双精度
精度 字节数 正数取值范围 负数取值范围
单精度类型 4 1.4e-45 至 3.4e+38 -3.4e+38 至 -1.4e-45
双精度类型 8 4.9e-324 至 1.798e+308 -1.798e+308 至 -4.9e-324

因为浮点数无法表示零值,所以取值范围分为两个区间: 正数区间和负数区间。下面分析单精度浮点数,而双精度浮点数与其相比只是位数不同。以当精度类型为例,它被分配了4个字节,总共32位。 

从数学世界的科学计数法映射到计算机世界的浮点数时,数制从十进制改为二进制,还要考虑内存硬件设备的实现方式。在规格化表示上存在差异,称谓有所改变,指数称为“价码”,有效数字称为“尾数”,所以用于存储符号、价码、尾数的二进制位分别称为符号位、价码位、尾数位。

1 符号位

在最高二进制位上分配1位表示浮点数的符号,0表示正数,1表示负数。

2价码位

在符号位右侧分配8位用来存储指数,IEEE754标准规定价码位存储的是指数对应的移码,而不是指数的原码和补码。根据计算机组成原理中对移码的定义可知,移码是将一个真值在数轴上正向平移一个偏移量之后得到的,即[x]^{移}^{移}移 = x + 2^{n - 1}(n为x的二进制位数,含符号位)。移码的几何意义是把真值映射到一个正数域,其特点是可以直观地反映两个真值的大小,即移码大的真值也大。基于这个特点,对计算机来说用移码比较两个真值的大小非常简单,只要高位对齐后逐个比较即可,不用考虑符号的问题,这也是价码会采用移码表示的原因所在。

由于价码实际存储的指数的移码,所以指数与价码之间的换算关系就是指数与它的移码之间的换算关系。假设指数的真值为e,价码为E,则有E = e + (2^{n - 1} - 1),其中2^{n - 1} - 1是IEEE754标准规定的偏移量,n = 8是价码的二进制位数。

为什么偏移量值为2^{n - 1} - 1而不是2^{n - 1}呢? 因为8个二进制位能表示的指数的取值范围为[-128, 127], 现在将指数变成移码表示,即区间[-128, 127]正向平移到正数域,区间里的每个数都需要加上128,从而得到价码范围为[0, 255]。由于计算机规定价码全为0或全为1两种情况被当做特殊值处理(全0被认为是机器零, 全1被认为是无穷大),去除这两个特殊值,价码的取值范围变成了[1, 254]。如果偏移量不变仍为128的话,根据换算关系公式[x]阶 = x + 128 得到指数的范围变成[-127, 126], 指数最大只能取到126,显然会缩小浮点数能表示的取值范围。所以IEEE754标准规定单精度的价码偏移量为2^{n - 1} - 1(即127),这样能表示的指数范围为[-126, 127],指数最大值能取到127。

3尾数位

最右侧分配连续的23位用来存储有效数字,IEEE754标准规定尾数以原码表示。正指数和有效数字的最大值决定了32位存储空间能够表示浮点数的十进制最大值。指数最大值为2^{127} \approx 1.7 x 10^{38},而有效数字部分最大值是二进制的1.111···1(小数点后23个1),是一个无限接近于2的数字,所以得到最大的十进制数为2 x 1.7 x 10^{38}, 在加上一个符号位,最终得到32位浮点数最大值为3.4e+38。

0111 1111 0111 1111 1111 1111 1111 1111

  • 红色部分为符号位,值为0,表示正数。

  • 绿色部分为价码位即指数,值为{\color{DarkBlue}{\color{DarkBlue} }2^{254-127} = 2^{127} \approx 1.7 \times 10^{38} }

  • 黄色部分为尾数位即有效数字,值为1.11111111111111111111111

科学计数法进行规格化的目的是保证浮点数表示唯一性。如同十进制规格化的要求1≤ |a| <10,二进制数值规格化后的尾数形式为1.xyz, 满足1≤ |a| < 2。为了节约存储空间,将符合规格化尾数首个1省略,所以尾数表面上是23位,却表示了24位二进制数。

常用浮点数的规格化表示如表1 - 5所示。

表1-5 浮点数的规格化表示
数值 浮点数二进制表示 说明
-16 1100 0001 1000 0000 0000 0000 0000 0000

第一位为符号位,1表示负数。131-127 = 4,即2^{4} = 16,

尾数部分为1.0①

16.35 0100 0001 1000 0010 1100 1100  1100 1101

第一位为符号位,0表示正数。绿色部分同上,

尾数部分见说明

0.35 0011 1110 1011 0011 0011 0011 0011 0011 此例说明16.35和0.35的尾数部分是不同的
1.0 0011 1111 1000 0000 0000 0000 0000 0000 127-127=0即2^{0}=1,尾数部分为1.0
0.9 0011 1111 0110 0110 0110 0110 0110 0110 126-127=-1即0.5②

注释:①尾数部分的有效数字为1.000 0010 1100 1100  1100 1101,将其转换成十进制值为1.021875,然后乘以2^{4}得到                      16.35000038。由此可见,计算机实际存储的值可能和真值是不一样的。补充说明,二进制小数转化为十进制小                        数,小数点后一位是2^{-1},依次累加即可,如1.00000101 = 1+2^{-6}+2^{-8} = 1.01953125

           ②0.9不能用有限二进制位进行精确表示,所以1-0.9并不精确的等于0.1,实际结果是0.100000024。

1.2.3 加减运算

在数学中,进行两个小数的加减运算时,首先要将小数点对齐,然后同位数进行加减运算。对两个采用科学计数法表示的数做加减运算时,为了让小数点对齐就需要确保指数一样。当小数点对齐后,再将有效数字按照正常的数进行加减运算。

(1)零值检测。检查参加运算的两个数中是否存在为0的数(0在浮点数是一种规定,即价码位和尾数位全为0),因为浮点数运算过程比较复杂,如果其中一个数为0,可以直接得出结果。

(2)对阶操作。通过比较阶码的大小判断小数点位置是否对齐。当阶码不相等时表示当前两个浮点数的小数点位置没有对齐,则需要通过移动尾数改变价码的大小,使二者最终相等,这个过程便称为对阶。尾数向右移动1位,则阶码值加1,反之减1。在移动尾数时,部分二进制位会被移出,但向左移使高位被移出,对结果造成的误差更大。所以,IEEE754规定对阶的移动方向为向右移动,即选择阶码小的数进行操作。

(3)尾数求和。当对阶完成后,直接按位相加即可完成求和(如果是负数则需要先转换成补码在进行运算。)这个道理与十进制数加法相同,例如9.8 x 10^{38} 与 6.5 x 10^{37} 进行求和,将指数小的进行升阶,即6.5 x 10^{37} 变成0.65 x 10^{38},然后求和得到结果为10.45 x 10^{38}

(4)结果规格化。如果运算结果仍然满足规格化形式,则无须处理,否则需要通过尾数位的向左或向右移动调整达到规格化形式。尾数位向右移称为右规,反之称为左规。如上面计算结果为10.45 x 10^{38}, 右规操作后为1.045 x 10^{39}

(5)结果舍入。在对阶过程或右规时,尾数需要右移,最右端被移出的位会被丢弃,从而导致结果精度的损失。为了减少这种精度的损失,先将移出的这部分数据保存起来,称为保护位,等到规格化后再根据保护位进行舍入处理。

了解了浮点数的加减运算过程后可以发现,阶码在加减运算过程中是用来比较大小,从而决定是否需要进行对阶操作。所以,IEEE754标准正对这一特性,将阶码采用移码表示,目的就是利用移码的特点来简化两个数的比较操作。下面针对前面的例子从对阶、按位减法的角度分析为什么1.0-0.9结果为0.100000024,而不是理论值0.1。1.0-0.9等价于1.0+(-0.9)的二进制编码:

1.0 的二进制编码为  0011 1111 1000 0000 0000 0000 0000 0000

-0.9 的二进制编码为  1011 1111 0110 0110 0110 0110 0110 0110

从上面可以得出二者的符号、阶码、尾数三部分数据,如表1-6所示。

表1-6 符号、阶码与尾数
浮点数 符号 阶码 尾数(红色表示规格化后最高位) 尾数补码
1.0 0 127 1000 0000 0000 0000 0000 0000 1000 0000 0000 0000 0000 0000
-0.9 1 126 1110 0110 0110 0110 0110 0110 0001 1001 1001 1001 1001 1010

 

由于尾数位的最左端存在一个隐藏位,所以实际尾数二进制分别为:1000 0000 0000 0000 0000 0000 和 1110 0110 0110 0110 0110 0110,红色为隐藏位。下面运算是基于实际的尾数位进行的,具体过程如下:

(1)对阶。1.0的阶码为127, -0.9的阶码为126,比较阶码大小后需要右移的是-0.9尾数的补码,使其阶码变为127,同时高位需要补1,移动后的结果为1000 1100 1100 1100 1100 1101,最左的1是高位补进的。注意,绿色的数字仅仅是为了方便阅读,更加清晰观察到数字为的对齐或整体移动方向。

(2)尾数求和。因为尾数都转换成补码,所以可以直接按位相加,注意符号位也要参与运算,如图1-5所示。

 

                                                                                                 图1-5    尾数求和示意

其中最左端位符号位,计算结果为0,尾数位计算结果为0000 1100 1100 1100 1100 1101。

(3)规格化。上一步计算结果并不符合要求,位数的最高位必须是1,所以需要将结果向左移4位,同时阶码需要减4.移动后阶码等于123(二进制为1111011),尾数为1100 1100 1100 1100 1101 0000。在隐藏尾数的最高位,进而变为100 1100 1100 1100 1101 0000。

综上所述,得出运算后结果的符号位0、阶码为1111011、尾数为100 1100 1100 1100 1101 0000,三部分组合起来就是1.0-0.9的结果,对应的十进制值为0.100000024。

思考如下代码运行结果

float g = 1.0f - 0.9f;
float h = 0.9f - 0.8f
/** 第一种,判断浮点数是否相等的方式 */
        
if (g == h){
    System.out.println("true");
}else {
    System.out.println("false");
}

/** 第二种, 判断浮点数是否相等的方式 */
Float x = Float.valueOf(g);
Float y = Float.valueOf(h);
if (x.equals(y)){
    System.out.println("true");
}else {
    System.out.println("false");
}

/** 第三种, 判断浮点数相等的方式 */
Float m = new Float(g);
Float n = new Float(h);
if (m.equals(n)){
    System.out.println("true");
}else {
    System.out.println("false");
}      

相信以上代码的运行结果会让人大跌眼镜,输出结果为3个false!1.0f - 0.9f与0.9f - 0.8f 的结果理应都为0.1,但实际是不行等的。上面已经分析出1.0f - 0.9f = 1.00000024,那么0.9f - 0.8f 的结果为多少呢? 0.9f - 0.8f等价于0.9+(-0.8),首先分析0.9与-0.8的二进制编码:

0.9的二进制编码为0011 1111 0110 0110 0110 0110 0110 0110

-0.8的二进制编码为 1011 1111 0100 1100 1100 1100 1100 1101

从上可以得出二者的符号、阶码、尾数三部分数据,如表1-7所示。

表1-7 0.9与-0.8的符号、阶码与尾数
浮点数 符号 阶码 尾数(红色表示规格化后的最高位) 尾数补码
0.9 0 126 1110 0110 0110 0110 0110 0110  1110 0110 0110 0110 0110 0110
-0.8 1 126 1100 1100 1100 1100 1100 1101 0011 0011 0011 0011 001 0011

 由于尾数位的最左端存在一个隐藏位,所以实际尾数二进制分别为:1110 0110 0110 0110 0110 0110 和 1100 1100 1100 1100 1100 1101,红色为隐藏位。下面运算都是基于实际的尾数进行的,具体过程如下:

(1)对阶。0.9和-0.8的阶码都为126,不需要进行移阶运算。

(2)尾数求和。因为尾数都转化成补码,所以可以直接按位相加,注意符号位也要参与运算,如图1-6所示。

 其中最左端为符号位,计算结果为0,尾数位计算结果为0001 1001 1001 1001 1001 1001

(3)规格化。上一步计算结果并不符合要求,尾数的最高位必须是1,所以需要将结果向左移3位,同时阶码需要减3.位移后阶码等于123(二进制为 1111011),尾数为1100 1100 1100 1100 1100 1000。再隐藏尾数的最高位,进而变为100 1100 1100 1100 1100 1000。

综上所述,得到运算结果的符号位为0、阶码为1111011、尾数为100 1100 1100 1100 1100 1000,三部分组合起来就是0.9f - 0.8f的结果,对应的十进制数值为0.099999964。

因此在浮点数比较时正确的写法:

float g = 1.0f - 0.9f;
float h = 0.9f - 0.8f;

double diff = 1e-6;
if (Math.abs(g - h) < diff){
    System.out.println("true");
}else {
    System.out.println("false");
}

BigDecimal a = new BigDecimal("1.0");
BigDecimal b = new BigDecimal("0.9");
BigDecimal c = new BigDecimal("0.8");
BigDecimal x = a.subtract(b);
BigDecimal y = b.subtract(c);
if (x.equals(y)){
    System.out.println("true");
}else {
    System.out.println("false");
}

 

1.2.4 浮点数的使用

在使用浮点数时推荐使用双精度,使用双精度由于表示区间的限制,计算结果会出现微小的误差,实例代码如下所示:

float ff = 0.9f;
double dd = 0.9d;
// 0.89999997615811421
System.out.println(ff/1.0);
// 0.9
System.out.println(dd/1.0);

在要求绝对精确表示的业务场景下,比如金融行业的货币表示,推荐使用整型存储其最小单位的值,展示时可以转换成货币的常用单位,比如人民币使用分存储,美元使用美分存储。在要求精确表示小数点n位的业务场景下,比如圆周率要求存储小数点后1000位数字,使用单精度和双精度浮点数类型保存是难以做到的,这时推荐采用数组保存小数部分的数据。在比较浮点数时,由于存在误差,往往会出现意料之外的结果,所以禁止通过判断两个浮点数是否相等来控制某些业务流程。在数据库中保存小数时,推荐是使用decimal类型,禁止使用float类型和double类型。因为这两种类型在存储的时候,存在精度损失的问题。

综上所述,在要求绝对精度表示的业务场景中,在小数保存、计算、转型过程中都需要谨慎对待。 


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

浮点数——科学计数法、浮点数表示、加减运算和浮点数的使用 的相关文章

  • 双指针、前缀和、二分、差分、递推

    维生素C吃多了会上火 个人CSDN博文目录 2022蓝桥杯 目录 前缀和 双指针 前缀和 激光炸弹 k倍区间 双指针 统计日志
  • Android的ScrollView简单使用实例(附Demo)

    目录 1 垂直滚动 Scroll 2 水平滚动 HorizontalScrollView Demo地址 https github com zGuangYuan Androidstudio example 垂直滚动 Scroll 水平滚动 H
  • Android开机流程(一)

    参考文章 Android系统开篇 一 概述 简单梳理下Andorid启动流程 一般操作系统启动流程如下图 Android系统启动流程概览 system server服务启动流程 启动过程 Loader gt Kernel gt Native
  • JSP数据交互(一)---内置对象》request(乱码解决)理解原理解决乱码问题

    Jsp内置对象之out JSp内置对象是Web容器创建的一组对象 没有进行声明创建但却可以使用out对象 不经常使用的内置对象 pageContext 内置对象的集大成者 config 指定Jsp页面初始配置的 Servlet page 当
  • C语言-----标识符、关键字、常量、变量

    这篇文章主要对C语言的标识符 关键字 常量 变量的一些细致知识点进行详细的讲解 比如 1 标识符的命名规范 也就是常量 变量 函数名的命名规则进行规范的讲解 2 C语言的关键字列表 3 常量的定义及其分类 4 对全局变量和局部变量的细节知识
  • 带你掌握Vue3新宠——快速Diff算法

    前言 我们都知道Vue 2中用的diff算法是双端Diff 而Vue 3的其中一个特性就是把底层的diff算法改成了快速Diff 与字面意思一样 快速diff是目前已知的最快的diff算法 本文将带大家解剖一下快速diff的原理 预处理 在
  • 常用服务器命令

    ssh 用户名 服务器地址 密码 nvidia smi查看当前显卡状态11 top 用户使用进程 Q 推出top CUDA VISIBLE DEVICESE 2 3 nohup python u test py gt test log 2
  • notepad++ json 排版插件 NPPJSONViewer dll

    将下载的32位或者64位插件dll文件拷贝到notepad 安装目录Notepad plugins 下面 例如我的目录 C Program Files Notepad plugins 拷贝后 或者在此路径下新建一个文件夹 重启notepad
  • cart回归树备忘录

    Cart回归树相关 决策树回顾 Cart树 分类树 回归树 最小二乘回归树 决策树回顾 1 决策树进化 ID3 C4 5 Cart 提问 异同点 2 决策树节点分裂评估准则 分类 信息增益 信息增益比率 gini系数 回归 MSE 提问 优
  • Python3,掌握这4个自动化脚本,让工作效率提升200%。

    4个自动化脚本 1 引言 2 自动发送多封邮件 2 1 模块介绍 2 2 代码实战 3 自动桌面提示 3 1 模块介绍 3 2 代码实战 4 自动生成素描草图 4 1 模块介绍 4 2 代码实战 5 自动化阅读网页新闻 5 1 模块介绍 5
  • kafka在Linux上的安装 运行,Linux下Kafka单机安装配置

    说明 操作系统 CentOS 6 x 64位 Kafka版本 kafka 2 11 0 8 2 1 实现目的 单机安装配置kafka 具体操作 一 关闭SELINUX 开启防火墙9092端口 1 关闭SELINUX vi etc selin
  • 8086汇编语言:标志寄存器的各个标志位的详细介绍

    一 基本介绍 CPU的内部的寄存器中 有一类特殊的寄存器 对于不同的处理机 其个数和结构都可能不同 它具有以下三种作用 这种特殊的寄存器在8086CPU中 被称为标志寄存器flag 8086CPU的标志寄存器有16位 其中存储的信息通常又被
  • 电路中VCC VDD VSS VEE GND的含义

    在电路中 芯片引脚经常会出现VCC VDD VSS VEE和GND这些标示 其中VCC一般表示通用芯片的电源引脚 比如一些模拟运放的正电源引脚 74系列数字芯片的电源引脚 VCC一般接相应的正电源电压 VDD一般表示数字芯片的电源引脚 如果
  • 手写Promise

    Promise是JS进行异步操作的重要API 也是开发基本上绕不开的技术 所以很有必要对其进行深入的了解 本文我们就 一步步手动实现Promise的相关功能 Promise属性和构造函数 原生功能 Promise对象的属性 验证原生Prom
  • python 工具变量回归_工具变量多重高维固定效应ivreghdfe

    Stable versionTo install reghdfe open Stata and run ssc install reghdfeNote that reghdfe requires at least Stata 11 2 an
  • win10启动项_win10系统开机启动项的设置教程

    小编给大家详解win10系统开机启动项的设置教程 使用win10系统过程中 有时会遇到启动项过多影响开机速度的问题 为此事困扰的用户 可参照以下的方法进行开机启动项的设置 win10系统的开机启动项如果过多的话 就会影响电脑的开机速度 其实
  • 计算机专业毕业设计一

    概述 从一个医学生转行成为一名程序员 对于我来说 是一个超前的跨越 好奇的朋友会问了 医学这么吃香的行业 怎么转行做码农呢 这个道理很简单 就是想象和显示差距太大了 距离梦想的专业差了点距离 请允许我去小黑屋哭上半个小时 想当年 我意气风发
  • JSP与Servlet之间的值传递种种

    这几天搞那个网上书店的过程中对JSP河Servlet有有了很多的认识 恩 下面是我遇到的问题解决了以后总结了一下 希望对大家有用吧 JSP与 servlet之间的传值有两种情况 JSP gt servlet servlet gt JSP 通

随机推荐

  • HTTPSConnectionPool(host='xxxxx', port=443): Max retries exceeded with url:xxxxxxxx (Caused by Ne...

    requests exceptions ConnectionError HTTPSConnectionPool host baike baidu com port 443 Max retries exceeded with url http
  • 提升mysql服务器性能(分库、分片与监控)

    节点一的建立 节点2 3 也要建立
  • MySQL学习5:事务、存储引擎

    事务 简介 事务是一组数据库操作的执行单元 它要么完全执行 要么完全不执行 事务是确保数据库中的数据一致性和完整性的重要机制之一 事务具有以下四个特性 称为ACID特性 原子性 Atomicity 事务作为一个整体被执行 要么全部操作成功
  • 一个开发的记单词小程序

    这里写目录标题 效果演示 功能1测试 功能简介 代码实现 效果演示 输入1 敲下Enter 回车键 后 进入第一个功能英译汉 给出Hello 用户输入中文意思 你好 敲下回车确定 进入下一个单词 功能1测试 功能简介 1 分别编辑中文和英文
  • Windows下的darknet安装

    1 下载darknet源码后 解压到文件夹 下载链接 https link zhihu com target https 3A github com AlexeyAB darknet 解压后的文件夹里面的内容是 2 打开build文件夹下的
  • 解决VMware“此主机支持Intel VT-x,但Intel VT-x处于禁用状态“

    1 问题 在启动VMware安装好的虚拟机时出现下图中的错误 2 问题原因 该主机处理器虚拟化技术处于禁用状态 可以在BIOS设置修改 3 问题处理 修改BIOS 本机型号为联想 开机点击F2进入BIOS 接着进入到bios的界面 选择标题
  • 被动与主动信息收集

    文章目录 信息收集 被动信息收集介绍 收集手段 收集内容 信息用途 信息收集 域名解析过程以手段 域名解析过程 信息收集 DNS DNS 信息收集 NSLOOKUP DNS 信息收集 DIG 查询网站的域名注册信息和备案信息 信息收集 被动
  • mysql 免安装版本下载地址

    5 7 32位 https dev mysql com get Downloads MySQL 5 7 mysql 5 7 19 win32 zip 5 7 64位 https dev mysql com get Downloads MyS
  • c源代码检查工具splint使用问题及方案

    splint使用时 可以使用splint help查看需要帮助的项目 然后针对需要了解的项目可以splint help 项目 查看具体的帮助 在splint使用过程中 老是出现Parse Error 下面是问题可能解决的方案 1 splin
  • cn_windows_7_ultimate_with_sp1_x64_dvd_u_677408.iso镜像下载

    链接 https pan baidu com s 1RvniUrq JpKQInKFs9bdvAhttps pan baidu com s 1RvniUrq JpKQInKFs9bdvA 提取码 zt88
  • Robot Framework 关于上传文件的问题的简单解决

    使用关键字选择文件 使用方式就是 解释一下 这里的xpath的 是输入标签的xpath的 而大多数的网络上传文件都会有这个输入标签 下边看几个简单的例子 本地上传按钮点开之后会弹出窗口选择文件 我们只需要获取这个本地上传的
  • VUE开发一个组件——Vue PC城市选择控件

    前言 前面用vue开发了三四个组件了 都是H5的 现在来看看PC是如何玩转组件的 其实和H5相同 样式不同而已 相关推荐 VUE开发一个组件 日历选择控件 VUE开发一个组件 移动端弹出层 IOS版 VUE开发一个组件 Vue tree树形
  • 建立和使用Python自定义模块

    文章目录 一 现状以及问题 二 Python模块 2 1 包的结构 2 2 包的位置 2 2 1 site packages目录 2 2 2 dist packages目录 2 3 自定义包 2 3 1 结构和位置 2 3 2 引用自定义包
  • 网关架构演进

    1 前言 天翼账号是中国电信打造的互联网账号体系产品 利用中国电信管道优势为企业提供用户身份认证能力 其中网关系统是天翼账号对外能力开放体系的重要组成 业务侧它以集中入口 集中计费 集中鉴权管控为目标 技术侧它支持隔离性 可配置 易开发 动
  • 什么是IO Pad?

    1 什么是IO pad IO pad是一个芯片管脚处理模块 即可以将芯片管脚的信号经过处理送给芯片内部 又可以将芯片内部输出的信号经过处理送到芯片管脚 输入信号处理包含时钟信号 复位信号等 输出信号包含观察时钟 中断等 IO pad模块可以
  • 防止浏览器嗅探音视频--blob对象在audio和video标签中的使用

    现在的浏览器很聪明 会对页面中的mp3 MP4等内容进行嗅探下载 但是对于部分付费或敏感内容 我们并不想版权资源被嗅探 这就需要使用html5 提供的 blob 对象对文件内容进行保护 blob格式的资源是无法被嗅探的 具体可以参考一下 b
  • 使用R语言计算DataFrame数据中指定范围多个数据列的两两相关系数

    使用R语言计算DataFrame数据中指定范围多个数据列的两两相关系数 在数据分析和统计建模中 了解数据列之间的相关性是非常重要的 R语言提供了许多函数来计算数据集中数据列之间的相关系数 本文将介绍如何使用R语言中的cor函数来计算Data
  • Hadoop的shuffle原理和过程图解

    wordcount为例详细阐述shuffle的实现过程 1 对HDFS输入的文件进行切割为KV形式 2 在mapper方法中执行 分割单词为KV形式 3 shuffle在Map端的三个操作 partition 多节点的相同K合并 sort
  • OpenCv中计算图像像素最大值、最小值、均值和方差

    1 寻找图像像素的最大值最小值 寻找图像最大值最小值的函数 minMaxLoc 函数 minMaxLoc 函数原型 void cv minMaxLoc InputArray src double minVal double maxVal 0
  • 浮点数——科学计数法、浮点数表示、加减运算和浮点数的使用

    目录 1 2浮点数 1 2 1 科学计数法 1 2 2 浮点数表示 1 符号位 2价码位 1 2 3 加减运算 1 2 4 浮点数的使用 1 2浮点数 浮点数是采用科学计数法来表示的 由符号位 有效数字 指数三部分组成 使用浮点数存储和计算