【计组】32位浮点数的表示范围以及如何解决精度缺失

简介: 【计组】32位浮点数的表示范围以及如何解决精度缺失

1 浮点数的定义


提及浮点数,脑中必然会联想到定点数。所以首先我们看下两者的定义,一探究竟。


在计算机中,数据有两种表达方式:定点数和浮点数,注意,这仅仅是数的两种表达方式,而不是两种数。


1、定点数:

定点数指小数点在数中的位置是固定不变的,通常有定点整数和定点小数。在对小数点位置作出选择之后,运算中的所有数均应统一为定点整数或定点小数,在运算中不再考虑小数问题。

(1)定义:数据中小数点位置固定不变的数

(2)种类:定点整数

(3)小数点在符号位与有效位之间。

注:定点数受字长的限制,超出范围会有溢出。


2、浮点数:

浮点数中小数点的位置是不固定的,用阶码和尾数来表示。通常尾数为纯小数,阶码为整数,尾数和阶码均为带符号数。尾数的符号表示数的正负;阶码的符号则表明小数点的实际位置。

(1)形式:N=M×2E

(2)M:尾数

(3)E:阶码

(4)在计算机中M和E表示形式为

阶码 尾数符号 尾数

将其与数学中的科学记数法进行比较。

注:其浮点数的精度由尾数决定,数的表示范围由阶码决定。


2 为什么要使用浮点数?


定点数的表示范围固定、有限。比如使用8位十进制来表示一个整数。

  • 最大:999999999
  • 最小:000000000


如果我们想要表示更大的一个数,便无从下手。所以数学中我们一般采用科学计数法来进行简化表示。


在计算机里,我们也可以用一样的办法,用科学计数法来表示实数。浮点数的科学计数法的表示,有一个 IEEE 的标准,它定义了两个基本的格式。一个是用 32 比特表示单精度的浮点数,也就是我们常常说的 float 或者 float32 类型。另外一个是用 64 比特表示双精度的浮点数,也就是我们平时说的 double 或者 float64 类型。双精度类型和单精度类型差不多,这里,我们来看单精度类型,双精度你自然也就明白了。

image.png


3 32位浮点数表示范围


image.png


关于最小数与最大数的表示,第一次学到这部分时,有些不理解。


最大数举例

image.png

注:理解的关键点在于尾数以及对应2进制指数转为十进制表示。


4 浮点数的精度缺失


image.png

public class FloatPrecision {
  public static void main(String[] args) {
    float a = 20000000.0f;
    float b = 1.0f;
    float c = a + b;
    System.out.println("c is " + c);
    float d = c - a;
    System.out.println("d is " + d);
  }
}


对应的输出结果就是:

c is 2.0E7
d is 0.0


应对精度丢失,我们可以使用Kahan Summation算法,令结果更为精确。

目录
相关文章
|
5月前
|
JSON 编解码 Go
Go 新一代网络请求resty!,比net/http好用10倍
resty 是 Go 语言高性能 HTTP 客户端,比 net/http 简洁 10 倍、比 axios 更 Go 风。零依赖、支持链式调用、自动 JSON 编解码、重试/拦截器/Mock/文件上传下载等,Go 1.18+ 可用,一行代码发起请求,大幅提升开发效率与可维护性。(239 字)
609 1
Go语言接口的定义与实现
Go 语言的接口提供了一种灵活的多态机制,支持隐式实现和抽象编程。本文介绍了接口的基本定义、实现方式、空接口的使用、类型断言以及接口组合等核心概念,并探讨了接口与 nil 的关系及应用场景。通过示例代码详细说明了如何利用接口提升代码的可扩展性和可测试性,总结了接口的关键特性及其在依赖注入、规范定义和多态调用中的重要作用。
505 14
|
存储 传感器 编解码
ROS机器视觉入门:从基础到人脸识别与目标检测
前言 从本文开始,我们将开始学习ROS机器视觉处理,刚开始先学习一部分外围的知识,为后续的人脸识别、目标跟踪和YOLOV5目标检测做准备工作。我采用的笔记本是联想拯救者游戏本,系统采用Ubuntu20.04,ROS采用noetic。 颜色编码格式,图像格式和视频压缩格式 (1)RGB和BGR:这是两种常见的颜色编码格式,分别代表了红、绿、蓝三原色。不同之处在于,RGB按照红、绿、蓝的顺序存储颜色信息,而BGR按照蓝、绿、红的顺序存储。 rgb8图像格式:常用于显示系统,如电视和计算机屏幕。 RGB值以8 bits表示每种颜色,总共可以表示256×256×256=16777216种颜色
712 70
|
Shell 开发工具 git
解决Git中没有小绿勾与红叉叉的问题
找到下面这个地址:\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers。后产生的,要在圈住的这几个在前面,添加空格(右击重命名加空格就能使它提到前面)关于要添加几个空格的问题,一般来说添加四个或者八个就可以。然后,重启电脑就能产生小绿勾和红叉叉的图标了。运行完重启电脑就好使。注意这一步一定要操作对,操作错误就会很多麻烦。寻找与自己电脑相配的软件版本就可以了。
2377 0
|
存储 程序员 芯片
虚拟地址和物理地址之间的区别
【4月更文挑战第12天】
2150 2
虚拟地址和物理地址之间的区别
|
编译器 API C语言
Cython 是什么?为什么会有 Cython?
Cython 是什么?为什么会有 Cython?
910 0
|
存储 NoSQL 关系型数据库
非关系型数据库NOSQL
非关系型数据库NOSQL
508 1
|
测试技术
Stanford斯坦福扫描3D模型下载方式及链接
Stanford斯坦福扫描3D模型下载方式及链接
748 0
位宽计算的系统函数$clog2,这些是你需要知道的【Verilog高级教程】
位宽计算的系统函数$clog2,这些是你需要知道的【Verilog高级教程】
位宽计算的系统函数$clog2,这些是你需要知道的【Verilog高级教程】
|
存储 安全 开发工具
【ZYNQ】基于 BRAM 的 PS 与 PL 数据交互
【ZYNQ】基于 BRAM 的 PS 与 PL 数据交互
2073 0