浮点数运算和溢出

article/2025/9/9 14:59:43

何为浮点数

在大部分实现中,浮点数通常是基于IEEE浮点标准用V=(-1)V=(-1)^{s}*M*2^{E}的形式来表示一个数

  • s是符号位,决定这个数是正数还是负数.
  • significand M是一个二进制小数,范围在[1~ 2 - \epsilon]或者[0-\epsilon] 中文称为尾数.
  • exponent E是对浮点数加权,权重是2的E次幂,中文称为码阶

将浮点数的位划分位3个字段,分别对这些值进行编码(encode value):

  • 最高位的单独位s直接编码成符号s,0或者1,0表示正数,1表示负数
  • k位的码阶字段集合exp= e_{k-1}...e_{1}e_{0} 编码阶码E
  • n位小数字段frac=f_{n-1}...f_{1}f_{0}编码尾数M,但是编码出来的值也依赖于解码的字段的值是否等于0

单精度浮点格式 s、exp、frac字段分别位1,8,23

双精度浮点格式 s、exp、frac字段分别位1,11,52

bit 分布如下: 

根据exp的值,被编码的值可以分成3种不同的情况(最后一种有两个变种),已单精度举例:

 

  •  情况1:规格化的值

这是最普遍的情况。当exp的位模式不全为0也不全为1时,都属于这种情况。在这种情况下阶码字段E=e-Bias ,其中e是无符号数,其位表示为e_{k-1}...e_{1}e_{0} ,Bias=2^{k-1} -1(单精度是127,双精度是1023),由此计算出的E的范围在单精度下是[-126~127],在双精度下是[-1022~1023].

小数字段frac被解释为描述小数值f (0\leq f < 1),其二进制表示为0.f_{n-1}...f_{1}f_{0}.实数值=b_{n-1}*2^{-1}+b_{n-2}*2^{-2}+...+b_{1}*2^{1-n}+b_{0}*2^{-n} 尾数定义为M=1+f.

  • 情况2:非规格化的值

当exp的位模式全为0时,在这种情况下,阶码E=1-Bias = -126,而尾数M=f,不包含隐含的开头1.为什么E没有=-Bias,而是E=1-Bias,是为了从非规格化值平滑的转换到规格化值的方法.

非规格化的值有两个用途:

  1. 提供了一种表示0的方法,因为使用规格化数M \geq 1,因此无法表示0.其中根据符号位不同,我们可以有+0.0-0.0。根据IEEE浮点格式,两者某些方面被认为是不同的,而在其他方面是相同的
  2. 提供一个可以表示非常接近0.0的数.它提供了一种属性,称为逐渐溢出,其中可能的数值分布均匀地接近于0.0
  • 情况3:特殊值

当exp的位模式全为1时出现。当小数域全为0时,得到的值表示无穷,当s=0时是+\infty;当s=1时是-\infty。当我们把两个非常大的数相乘,或者除以0时,无穷可以表示“溢出”的结果。当小数域为非零时,结果值被称为“NaN”,无效值(Not a Number的缩写)。比如当计算\infty-\infty时,也可用于表示未初始化的数据。

截图给出了一些边界值的构成,包括最大/小值,无穷值,0

舍入

由于实数表示的精度与范围的限制,浮点型只能近似的表示实数,因此对于值x,我们一般想用一种系统的方法,能够找到“最接近的”匹配值x^{'} ,x^{'}能够用期望的浮点形式表示出来。这就是舍入的运算任务。一个关键的问题是在两个可能值的中间如何确定舍入的方向。我们有4种舍入方式:

 向零舍入方式把正数向下舍入,把负数向上舍入。

向下舍入方式把正数和负数都向下舍入

向上舍入方式把正数和负数都向上舍入

偶数舍入就是4舍5入,选择这种模式是因为在大多数现实情况种避免了求平均值的统计误差。

溢出

浮点型计算都是按照实数来进行,不像整数计算有正+正溢出的负的情况,当浮点计算溢出有两种情况:

  1. 向无穷大溢出:当求得的值大于浮点型能表示的最大值,就变为+\infty,负无穷同理 
  2. 向0溢出:当为正数时,当求得的值小于能表示的最小值时,舍入为0,-0同理

计算法则

有别于整数运算,支持结合律,交换律,分配律。浮点型计算不支持结合律,就是说

x=a+b+c

t=b+c,x=a+t

求得的x值可能是不一样的,虽然差异小的无关紧要,但是这妨碍的编译器的优化,结果是编译器倾向于保守,避免任何对功能产生影响的优化,即使是很轻微的影响。


http://chatgpt.dhexx.cn/article/XggNTUZv.shtml

相关文章

浮点数的运算

浮点数的加减运算 从十进制科学计数法理解浮点数的加减运算&#xff1a; 对阶的原则是小阶对大阶&#xff08;算术右移&#xff09;&#xff0c;之所以这样做是因为若大阶对小阶&#xff08;算数左移&#xff09;&#xff0c;则尾数的数值部分的高位需移出&#xff0c;而小阶对…

浮点数的加法运算

浮点数的加法运算分以下五个步骤&#xff1a; 1、对阶&#xff1a; 这一点和十进制中计算指数一样&#xff0c;首先应该使指数化为相同的指数幂&#xff0c;例如&#xff1a; x3*10^4,y4*10^3,则&#xff0c;xy3*10^40.4*10^4(30.4)*10^4 二进制中也是如此&#xff1a; x.…

2.6 浮点运算方法和浮点运算器

学习目标&#xff1a; 以下是一些具体的学习目标&#xff1a; 理解浮点数的基本概念和表示方法&#xff0c;包括符号位、指数和尾数。学习浮点数的运算规则和舍入规则&#xff0c;包括加、减、乘、除、开方等。了解浮点数的常见问题和误差&#xff0c;例如舍入误差、溢出、下…

什么是浮点数?

微信搜索关注「水滴与银弹」公众号&#xff0c;第一时间获取优质技术干货。7年资深后端研发&#xff0c;用简单的方式把技术讲清楚。 在上一篇文章中&#xff0c;我们主要介绍了在计算机中使用定点数表示数字的方式。 简单回顾一下&#xff0c;简单来说&#xff0c;用定点数表…

浮点数加减运算

浮点运算要把阶码和尾数分别处理。 阶码的运算是定点整数运算&#xff0c;对阶码的运算四种&#xff1a;阶码加1&#xff0c;阶码减1&#xff0c;两阶码求和&#xff0c;两阶码求差。 尾数的运算是定点小数运算&#xff0c;运算过程中一般取双符号位 浮点运算器总是由处理阶…

浮点数运算原理详解

导读&#xff1a;浮点数运算是一个非常有技术含量的话题&#xff0c;不太容易掌握。许多程序员都不清楚使用操作符比较float/double类型的话到底出现什么问题。 许多人使用float/double进行货币计算时经常会犯错。这篇文章是这一系列中的精华&#xff0c;所有的软件开发人员都应…

浮点数运算——加减乘除都有哈

什么是浮点数 浮点数运算异常 IEEE 754 标准规定的五种异常情况 浮点数除0的问题 浮点数加减运算 浮点数乘除运算 导读&#xff1a;浮点数运算是一个非常有技术含量的话题&#xff0c;不太容易掌握。许多程序员都不清楚使用操作符比较float/double类型的话到底出现什么问题…

浮点数的运算步骤

浮点数的运算步骤 浮点数的加减运算一般由以下五个步骤完成&#xff1a;对阶、尾数运算、规格化、舍入处理、溢出判断 一、对阶 所谓对阶是指将两个进行运算的浮点数的阶码对齐的操作。对阶的目的是为使两个浮点数的尾数能够进行加减运算。因为&#xff0c;当进行M x2Ex与M …

浮点数运算

今天学习了浮点数运算&#xff08;加减乘除&#xff09;。浮点数运算主要包括两部分&#xff1a;指数运算和尾数运算。在IEEE754标准下&#xff0c;指数运算就是阶码的运算&#xff0c;类似于无符号数运算。尾数运算是原码运算。之前一直很疑惑为什么前面的教材在介绍原码运算&…

计算机组成原理:浮点数的加、减、乘、除运算(含实例完整运算)

目录 浮点数的加减运算 零操作数的判断 对阶操作 尾数的加减操作 尾数的规格化 结果的舍入处理 结果的溢出判断 加减实例运算过程 浮点数的乘除法 零操作数的检查 阶码的加减操作 尾数的乘除操作 结果的规格化、舍入处理及溢出的判断 具体的操作如下图 乘除实例运算…

浮点数的运算方法

浮点数的运算方法 一、浮点数的表示1.浮点数的表示2.IEEE 754标准3.浮点数类型 二、浮点数的加减法1.定义2.运算步骤 三、运算部件四、强化练习 一、浮点数的表示 1.浮点数的表示 Ms表示尾数的符号位&#xff0c;E中1bit保存阶码的符号位其余空间存放阶码值&#xff0c;M中存放…

typeScript 接口(interface)及其与类型别名(type)的区别

背景 最近自己在学习一些视频剪辑相关的工具&#xff0c;像爱剪辑&#xff0c;剪映这些软件。然后就想自己是不是也可以实现一个类似的&#xff0c;轻量级的在线剪辑工具。最后发现这个款node端的工具库FFCreator&#xff0c;接下来简单介绍一下如何来搭建开发环境&#xff0c…

Type Description : This type is a general type that can be used to declare

错误描述&#xff1a; Complex type: param-valueType Description : This type is a general type that can be used to declare parameter/value lists. 解决方法&#xff1a; 把0移到init-param下面

Type and Value

Type and Value 前言一、reflect.Type1.1 数据结构1.2 方法1.2.1 所有类型通用方法1.2.2 不同基础类型的专有方法 二、reflect.Value总结参考资料 前言 reflect.Type和reflect.Value是go 反射的两大基本类型&#xff0c;一个管变量的类型方面&#xff0c;一个管变量的值方面。…

typescript interface 与 type 声明类型的区别

在 typescript 中, 我们定义类型有两种方式&#xff1a; 接口(interface) 和类型别名(type alias) 在官方文档中我们可以看到: Unlike an interface declaration, which always introduces a named object type, a type alias declaration can introduce a name for any kind…

type是什么

作者&#xff1a;newis 链接&#xff1a;https://www.zhihu.com/question/376890141/answer/1302417252 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 程语言的Type的话&#xff0c;有在不同的场景下有不同的意义…

Type-C

一、Type-C 从USB TYPE-C 的Spec上截一个USB TYPE-C母座的pin脚图&#xff1a; 可以看出&#xff0c;母座上有24根信号&#xff0c; 其中电源和地占据了8根&#xff0c;用于提升电流传输能力&#xff0c;剩下16个&#xff1a; &#xff08;1&#xff09;传输USB3数据的RXx和…

Java Type

Type 是Java 编程语言中所有类型的公共高级接口&#xff08;官方解释&#xff09;&#xff0c;也就是Java 中所有类型的”爹“。其中”所有类型“的描述尤为指的关注。它并不是我们平常工作中经常使用的int、String、List、Map等数据类型&#xff0c;而是从Java语言角度磊说&am…

常见USB接口总结:Type-A、Mini-USB、Micro-USB、Type-C等等

写在前面 最近在整理之前的笔记&#xff0c;打算把一些有价值的笔记发到CSDN分享一下。这篇总结参考的链接如下&#xff0c;结合了自己找的一些图片&#xff0c;非原创&#xff0c;侵权的话私聊我删除。 参考文章链接 https://mb.zol.com.cn/514/5147157.html 总览 标准Type-…

# USB Type-A、Type-B、Type-C及MicroUSB、MiniUSB接口定义

USB Type-A、Type-B、Type-C及MicroUSB、MiniUSB接口定义 文章目录 USB Type-A、Type-B、Type-C及MicroUSB、MiniUSB接口定义1 USB Type-A&#xff08;USB-A&#xff09;2 USB Type-B&#xff08;USB-B&#xff09;3 USB Type-C&#xff08;USB-C&#xff09;3.1 24Pin3.2 16Pi…