首页 > 其他分享 >简读+案例:一文带你秒懂IEEE 754浮点数~

简读+案例:一文带你秒懂IEEE 754浮点数~

时间:2024-03-19 10:32:36浏览次数:22  
标签:表示 754 二进制 浮点数 指数 127 简读 小数

一、简介

1、常见的浮点数表示方式是IEEE 754标准,它规定了浮点数的存储格式和运算规则,这个标准定义了两种浮点数表示:单精度和双精度。

2、任何一个浮点数的二进制数可以写为:NUM = (-1) ^ S* 2 ^ E * M 。以float32类型举例:

    2.1、S表示符号:S为0时表示一个正数;当S为1时表示一个负数

    2.2、E表示阶乘、指数:E是一个无符号整数,所以E的取值范围为(0~ 255)。但是在计数中指数是可以为负的,所以规定在存入E时,在它原本的值上加上中间数(127),在使用时减去中间数(127),这样E的真正取值范围就成了(-127~128)。对于E还分为以下三种情况:

(1)E不全为0,不全为1:这时就用正常的计算规则,E的真实值就是E的字面值减去127(中间值),M的值要加上最前面的省去的1

(2)E全为0:这时指数E等于1-127为真实值,M不再加上舍去的1,而是还原为0.xxxxxxxx小数。这样为了表示0,和一些很小的整数。

(3)E全为1时分三种浮点数特殊情况:M全为0时,±无穷大(取决于符号位);M为非全0时,表示NaN。

    2.3、M表示有效数字、尾数:规定M的值一定是1 <= M < 2,可以写成1.xxxxxxx的形式,所以规定M在存储时舍去第一个1,只存储小数点之后的数字。这样做节省了空间,以float类型为例,就可以保存23位小数信息,加上舍去的1就可以用23位来表示24个有效的信息

3、单精度(32位):符号位(1 bit)、指数位(8 bits)、尾数位(23 bits)

4、双精度(64位):符号位(1 bit)、指数位(11 bits)、尾数位(52 bits)

5、存储格式:以float32的浮点数举例如下图

二、十转二进制

1、以float32浮点数和23.375浮点数举例

2、整数转换方式:对2取余

3、小数转换方式:对小数进行2乘留整再对小数2乘直至为小数部分为0

4合并整数和小数部分:10111 和小数部分 0.011 得到二进制浮点数 10111.011

5、规范化和指数表示

(1)规范化二进制浮点数,确保小数点前只有一位非零数,得到 1.0111011。调整小数点的位置,相应地更新指数值

(2)指数表示:在IEEE 754标准中,添加一个偏移值。如果规范化后的二进制表示为 1.0111011,那么指数为 4,因为小数点向左移动4位。加上偏移值,指数为 4 + 127 = 131,转为二进制为10000011

6、最终,将符号位、指数和尾数合并,得到IEEE 754标准的二进制浮点数表示为:

三、二转十进制

1、以上面的23.375浮点数的转换结果0 10000011 01110110000000000000000举例

2、主要是这个公式:NUM = (-1) ^ S * 2 ^ E * M,分三步

第一步:(-1) ^ S

第二步:2 ^ E

第三步:M

3、符号位 (-1) ^ S:(-1)^0

4、指数位 2 ^ E :将二进制转十进制为131,然后减去偏移值127,得到5、那么这里就是 2 ^ 4

6、M:分两步

    1. 先转换为二进制浮点数,根据E不全为0或1的规则得到:1.01110110000000000000000

    2. 再用2的阶乘的方式转换为浮点数,如下:

四、误差

1、如下代码展示

2、原因:在计算机中,由于浮点数的表示方式是有限的,有些十进制小数无法精确表示为二进制浮点数。这导致在进行浮点数运算时可能出现舍入误差,进而导致预期的结果和实际的二进制浮点数表示的结果不完全相等。

3、将0.1转为二进制

4、这个过程会一直持续下去,因为 0.1 在二进制中是一个无限循环小数。

5、将-0.1转为二进制

6、首先,-0.1 可以表示为二进制的补码形式。如果我们考虑一个32位的单精度浮点数,其符号位为1,指数位为127(偏移值),尾数部分为 0.00011001100110011001100...(重复的 1100 模式)。

7、进行加法操作

8、这个结果实际上是一个无限循环的二进制小数。由于计算机内存是有限的,最终只能存储一个有限位数的二进制小数,因此可能会进行截断或舍入操作,导致精度损失。

9、在实际计算机系统中,这种舍入误差可能会导致结果不等于精确的零,因为我们不能精确地表示无限循环小数。这就是为什么在计算机编程中进行浮点数比较时,通常使用一个小的误差范围而不是直接比较相等。

10、改进方式

标签:表示,754,二进制,浮点数,指数,127,简读,小数
From: https://blog.csdn.net/weixin_58602623/article/details/136811636

相关文章

  • 3121002754 刘栋
    个人项目仓库地址*PSP2.1**PersonalSoftwareProcessStages**预估耗时(分钟)**实际耗时(分钟)*Planning计划3030Estimate估计这个任务需要多少时间510510Development开发6060Analysis需求分析(包括学习新技术)3030DesignSpec生成设计文档3......
  • 【C语言——浮点数在内存中的存储(补充篇)】
    一.概况     根据国际标准IEEE(电气和电子工程协会)754,任意一个二进制浮点数都可以表示为以下形式:V=(-1)^s*M*2^E1.(-1)^表示符号位,当s=0时,V为正数;当s=1,V为负数。2.M表示有效数字,M是大于等于1,小于2的。3.2^E表示指数。  二.存储过程IEEE754对有效数字M......
  • 整数和浮点数在内存中储存的形式
    整数整数的二进制表示法有三种,即原码、反码、补码。三种表示方式均有符号位和数值位符号位位于数值位最高位的那一位,分别用0和1表示,0表示正数,1表示负数。数值位,除最高位的那一位外其他都是数值位。正整数的原码、反码和补码都相同,负整数不同,负整数的反码等于原码二进制......
  • 整数与浮点数在内存中的存储
    前言:整数和浮点数在内存中都是用二进制补码存储,但存储的方式不同,本文讲讲二者的存储方式。目录1.整形的存储方式 2.浮点型的存储方式 1.整形的存储方式 最高位为字符位判断该整形数是正还是负,若符号位为1则是正数,若为0则为负数。其余位存放数值的大小。数......
  • 整数和浮点数在内存中的储存(包含原反补码的讲解)
    在c语言中,我们常常使用整数和浮点数,那么你知道整数和浮点数在内存中是如何储存的吗?下面大家一起学习。文章目录一.整数在内存中的储存二.了解大小端字节序三.浮点数在内存中的储存一、整数在内存中的储存整数的二进制表示方法有三种:原码、反码、补码。有符号整数......
  • 机器数存储(原码、反码、补码、移码表示范围、浮点数对阶)
    机器数:各种数值在计算机中表示的形式,其特点是使用二进制计数制,数的符号用0和1表示,小数点则隐含,不占位置。机器数有无符号数和带符号数之分。无符号数表示正数,没有符号位。带符号数最高位为符号位,正数符号位为0,负数符号位为1。真值:机器数对应的实际数值。原码、反码、补码正数......
  • JavaScript 内置 Number 类型在处理浮点数时的精度问题 是如何造成的?
    JavaScript内置的Number类型在处理浮点数时的精度问题主要是由以下原因造成的:IEEE754浮点数标准:JavaScript中的数字是基于IEEE754标准实现的双精度浮点数(64位),其中:最高1位为符号位(0表示正数,1表示负数)。接下来的11位用于存储指数部分(范围大约从-1022到1023)。剩余的......
  • 无符号整数和浮点数的文法
    目录无符号整数的文法浮点数的文法在编写无符号整数(UnsignedInteger)和浮点数(FloatingPointNumber)的文法时,我们通常使用BNF(巴科斯-瑙尔范式)或EBNF(扩展巴科斯-瑙尔范式)等描述形式语言的工具。这些工具提供了一种简洁的方式来定义语法规则。以下是无符号整数和浮点数的一种可能......
  • 15张图带你深入理解浮点数
    本着「要学习就系统透彻的学」这个原则,本文通过图的方式尽可能详细的讲解浮点数,让大家能够对浮点数有一个更深层次的认识。本文目录: 0、几个问题开始之前请思考如下问题:二进制0.1,用十进制表示的话是多少?十进制的0.1,用二进制表示又是多少?为什么0.1+0.2=0.300000000......
  • 串口收发浮点数加示例代码(共用体)
    #include"stdio.h"#include"string.h"unionData{charstr[4];//float占用4个字节所以给四个字符floatnum;};intmain(){unionDatasend_data,receive_data;send_data.num=43.43;//通过串口发送43.43,只需要放入共用体里面,然后通过发送四个char数据,下面是......