浮点数的表示

news2024/11/18 17:28:45

文章目录

  • 一、基本介绍
  • 二、IEEE 754标准浮点数
  • 三、浮点数的运算
    • 3.1 浮点数的加减法
    • 3.2 浮点数的乘法
    • 3.3 浮点数的除法
  • 四、demo
  • 参考

一、基本介绍

浮点数是与定点数相对的概念,计算机中的定点数约定小数点的位置不变。

由于计算机字长的限制,当需要表示的数据有很大的数值范围时,不能直接用定点小数或者定点整数表示。

浮点数由尾数 M M M和阶码 E E E构成。

基数为2的数 F F F的浮点数表示为:
F = 2 E × M F = 2^E \times M F=2E×M
浮点数编码的规则:

  1. 尾数 M M M必须为小数,用 n + 1 n+1 n+1位有符号定点小数的形式表示,可以采用原码、补码
  2. 阶码 E E E必须为整数,用 k + 1 k+1 k+1位有符号定点整数表示,可以采用原码、补码、移码
  3. 浮点数的编码位数 m = ( n + 1 ) + ( k + 1 ) m=(n+1)+(k+1) m=(n+1)+(k+1)

浮点数的编码格式有多种,格式的选择可以由计算机设计人员决定,例如:
[图片]

详细解释

  • 阶码是整数,其位数 k + 1 k+1 k+1决定了浮点数表示的数值范围(小数点在数据中的真实位置)。阶符决定了阶码的正负。阶码越长,所能表示的范围越大。
  • 尾数是小数,其位数 n + 1 n+1 n+1决定了浮点数的精度。尾数越长,所能表示的精度越高。
  • 尾数的符号表示浮点数的正负。

二、IEEE 754标准浮点数

IEEE 754规定单精度浮点数的真值一般表示为:
N = ( − 1 ) s × 2 e − 127 × 1. f N = (-1)^s \times 2^{e-127} \times 1.f N=(1)s×2e127×1.f
单精度浮点数的编码格式由3个字段构成

  • 数符 s s s为1位,表示浮点数的正负
  • 尾数编码 f f f为23位,采用原码表示
  • 阶码 e e e编码为8位( 含1位阶符,采用移码表示,偏移量127 )

注意点:

  1. IEEE 754中的阶码采用移码来表示,但是对于单精度浮点数来说,移码的偏移量不是 2 7 2^7 27,而是 2 7 − 1 = 127 2^7-1 = 127 271=127, 因为IEEE 754 将移码编码的全0和全1作为了特殊标识。
  2. IEEE 754浮点数为规格化的浮点数,为了能够更多的表示尾数的有效位数,规定尾数真值的整数部分必须为1,尾数编码时整数1隐去,小数部分 f f f用原码表示。

IEEE 754阶码的规定
在这里插入图片描述

IEEE 754标准的32位浮点数格式为:
[图片]

  • 数符:0正,1负
  • 阶码:阶码真值+127
  • 尾数:23位,采用隐含尾数最高位1的表示方法,实际尾数24位,尾数真值=1+尾数
    在这里插入图片描述

阶码e全0和全1时的特殊含义:

  1. 阶码全0,且尾数f不全为0时,表示表示该浮点数不是规格化浮点数。
  2. 阶码e全1,且尾数f全0时,则该浮点数表示正无穷大或者负无穷大,当数符s为1时,表示负无穷大,当数符s为0时,表示正无穷大。
  3. 阶码e全1,且尾数不全为0时,则该浮点数表示非数值数据(NaN)。

浮点数的舍入规则:

  1. 就近舍入
  2. 朝0舍入
  3. 朝无穷大舍入
  4. 朝负无穷舍入

三、浮点数的运算

3.1 浮点数的加减法

  1. 对阶:尾数右移,小阶对大阶,阶码小的尾数右移,阶码+1
  2. 尾数加减法运算:使用补码运算,减法也采用补码加法实现
  3. 规格化:尾数加减法运算后,结果可能是非规格化数,如果结果的真值 M M M不满足 1 2 < M < 1 \frac{1}{2} < M < 1 21<M<1,则是非规格化数需要进行规格化处理。

3.2 浮点数的乘法

  1. 两乘数一定是规格化数,若有一个乘数为0,则乘积一定为0。
  2. 求乘积的阶码: E z = E x + E y E_z = E_x + E_y Ez=Ex+Ey, 判断积的阶码是否溢出:上溢、下溢
  3. 求乘积的尾数:两乘数的尾数相乘。
  4. 规格化乘积的尾数

3.3 浮点数的除法

  1. 被除数、除数一定是规格化数,除数不等于0,若被除数为0,则商必为0
  2. 求商的阶码: E z = E x − E y E_z = E_x - E_y Ez=ExEy, 判断商的阶码是否溢出:上溢、下溢
  3. 求商的尾数: M z = M x ÷ M y M_z = M_x \div M_y Mz=Mx÷My
  4. 规格化商的尾数

四、demo

展示C语言中单精度1.0和-1.0的表示

#include <stdio.h>
#include <stdlib.h>
/**
 *        float     31   30-23  22-0
 *         符号位  阶码  尾数 
 */
 
/**
 * 大端模式(大端字节序):低字节内容存在高地址,高字节内容存在低地址。
 * 小端模式(小端字节序):低字节内容存在低地址,高字节内容存在高地址。
 */
char if_big_endian(){
        short endian = 1;
        if( endian&0x01 == 1 ){
                return 0;
        }else {
                return 1;
        }
}

void print_byte( char*data){
        for( int i=7;i>=0;i--){
                printf("%d",((*data)>>i)&0x01);
        }
}

void print_data( char *data, int byte_len){
        for(int i=0;i<byte_len;i++){
                if( if_big_endian() ){
                        print_byte(data+i) ;
                } else {
                        print_byte(data+ byte_len -1 -i) ;
                }
        }
        printf("\r\n"); 
} 

void set_bit(char * data,int byte_len,int idx){
        int byte_idx = idx/8;
        int bit_idx  = idx%8;
        if( !if_big_endian() ){
                *(data+byte_idx) |= 0x01 << bit_idx;
        } else {
                *(data+ byte_len -1 -byte_idx) |= 0x01 << bit_idx;
        }
}

void reset_bit(char * data,int byte_len,int idx ){
        int byte_idx = idx/8;
        int bit_idx  = idx%8;
        if( !if_big_endian() ){
                *(data+byte_idx) &= ~(0x01 << bit_idx);
        } else {
                *(data+ byte_len -1 -byte_idx) &= ~(0x01 << bit_idx);
        }
}

int main(){
        float  num1 = 1;
        char * p1 = ( char*)&num1;
        printf("float  1: ");
        print_data(p1,4);
        
        float  num2 = -1;
        char * p2 = ( char*)&num2;
        printf("float -1: ");
        print_data(p2,4);
        
        return 0;
} 

[图片]

  • 数符: 0表示正数、1表示负数
  • 数字1,阶码的真值为0,移码为0+127 = 127 = 01111111b
  • 尾码为0

参考

https://blog.csdn.net/weixin_45863060/article/details/125054244

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1384868.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

几种mq实现延迟队列的方式

文章目录 rocket mq&#xff1a;延时消息rabbit mq&#xff1a;死信队列kafka方案&#xff1a;多级分区举例优点 rocket mq&#xff1a;延时消息 rabbit mq&#xff1a;死信队列 消息设定一段时间未消费就进入死信队列&#xff0c;然后消费者监听死信交换机。 kafka kafka自身…

【MySQL】mysql集群

文章目录 一、mysql日志错误日志查询日志二进制日志慢查询日志redo log和undo log 二、mysql集群主从复制原理介绍配置命令 读写分离原理介绍配置命令 三、mysql分库分表垂直拆分水平拆分 一、mysql日志 MySQL日志 是记录 MySQL 数据库系统运行过程中不同事件和操作的信息的文件…

vue的element ui使用el-table组件实现懒加载树、默认自动展开层级(一层,二层)、并且解决新增、删除、修改之后树节点不刷新问题

1.整体思路 问题&#xff1a;数据量太大了&#xff0c;导致接口返回数据时间较长。解决: 将ElementUi中Table组件加载改为懒加载&#xff08;查看文档&#xff09;。思路&#xff1a;初始化打开页面时只显示第一级菜单,用户点击展开菜单之后往后端发送请求,然后加载出一级子菜…

13 | 使用代理ip爬取安居客房源信息

这是一个简单的Python爬虫代码,用于从安居客网站爬取房地产信息。该爬虫使用了代理IP来绕过可能的封禁,并提供了一些基本的信息抽取功能。 如果访问过多,那么可能出现了验证码 对此,最好的方法就是换ip。 使用代理IP的主要目的是保护爬虫的稳定性和隐私。以下是一些常见的原…

使用docker搭建LNMP架构

目录 环境准备 下载安装包 服务器环境 任务分析 nginx部分 建立工作目录 编写 Dockerfile 脚本 准备 nginx.conf 配置文件 生成镜像 创建自定义网络 启动镜像容器 验证nginx MySQL部分 建立工作目录 编写 Dockerfile 准备 my.cnf 配置文件 生成镜像 启动镜像…

优先级队列(Priority Queue)

文章目录 优先级队列&#xff08;Priority Queue&#xff09;实现方式基于数组实现基于堆实现方法实现offer(E value)poll()peek()isEmpty()isFull() 优先级队列的实现细节 优先级队列&#xff08;Priority Queue&#xff09; 优先级队列是一种特殊的队列&#xff0c;其中的元素…

基础命令继续

1&#xff1a;创建目录命令 mkdir命令 注意&#xff1a;创建文件夹需要修改权限&#xff0c;请确保操作均在HOME目录内&#xff0c;不要在Home外操作&#xff0c;涉及到权限问题&#xff0c;HOME外无法识别 小结&#xff1a; 练习: 2&#xff1a;touch创建文件 2&#xff1a;c…

统计学-R语言-4.5

文章目录 前言多变量数据多维列联表复式条形图并列箱线图R语言中取整运算主要包括以下五种&#xff1a; 点带图多变量散点图重叠散点图矩阵式散点图 练习 前言 本篇文章将继续对数据的类型做介绍&#xff0c;本片也是最后一个介绍数据的。 多变量数据 掌握描述多变量数据的分…

pytorch集智4-情绪分类器

1 目标 从中文文本中识别出句子里的情绪。和上一章节单车预测回归问题相比&#xff0c;这个问题是分类问题&#xff0c;不是回归问题 2 神经网络分类器 2.1 如何用神经网络分类 第二章节用torch.nn.Sequantial做的回归预测器&#xff0c;输出神经元只有一个。分类器和其区别…

安装nodejs出现问题

Error: EPERM: operation not permitted, mkdir… 全局安装express模块进行测试时&#xff1a; npm install express -g出现&#xff1a; 表示nodejs的安装目录无权限&#xff0c;根据错误日志的信息&#xff0c;定位到安装目录下&#xff1a; 点击属性&#xff1a; 点击编…

【江科大STM32合集】day2按键控制LED光敏传感器控制峰鸣器

【STM32合集】day2按键控制LED&光敏传感器控制峰鸣器 电路基础c语言基础main.ckey.c结果 实现一个键开关灯实验结果避坑 电路基础 运算放大器-在江科大51单片机b站视频&#xff08;AD/DA&#xff09;复习 原理&#xff1a;两个极端 同相输入端电压 》反相输入端 电压输出最…

基于RTOS(实时操作系统)的CMT液晶屏控制器驱动程序开发与实现

RTOS&#xff08;实时操作系统&#xff09;提供了一种有效的方式来管理和调度多任务系统&#xff0c;对于液晶屏控制器的驱动程序开发来说&#xff0c;RTOS能够提供良好的实时性和可靠性。本文以RTOS为基础&#xff0c;设计并实现了一个用于控制CMT液晶屏的驱动程序。在设计过程…

【android】rk3588-android-bt

文章目录 蓝牙框架HCI接口蓝牙VENDORLIBvendorlib是什么 代码层面解读vendorlib1、 vendorlib实现&#xff0c;协议栈调用2、协议栈实现&#xff0c;vendorlib调用&#xff08;回调函数&#xff09;2.1、 init函数2.2、BT_VND_OP_POWER_CTRL对应处理2.3、BT_VND_OP_USERIAL_OPE…

【LV13 DAY16 轮询与中断】

轮询实现按键实验 #include "exynos_4412.h"int main() {//GPX1_1设置为输入模式//GPX1.CONGPX1.CON & (~ (0XF<<4));while(1){if(!(GPX1.DAT&(1<<1))){printf("key pressed\n");while(!(GPX1.DAT&(1<<1)));}else{}}return…

i18n多国语言Internationalization的实现

i18n 是"Internationalization”的缩写&#xff0c;这个术语来源于英文单词中首尾字母“”和“n”以及中间的字符数(共计18个字符) 当我们需要开发不同语言版本时&#xff0c;就可以使用i18n多国语言的一个操作处理&#xff0c;i18n主要实现那一方面的内容呢&#xff1f;…

蓝桥杯省赛无忧 STL 课件17 map

01 map 02 multimap 03 unordered_map 04 代码示例

训练DAMO-YOLO(damoyolo_tinynasL25_S.py)

文章目录 参考链接1 准备数据1.1 转为COCO格式1.2 指明数据路径 2 设置训练配置文件&#xff0c;在configs/damoyolo_tinynasL25_S.py进行如下两块修改2.1 关于训练参数的设置2.2 根据自己数据集设置 3 开始训练4 调用tools/eval.py进行测试5 训练时可能遇到的报错5.1 RuntimeE…

Java生成四位数随机验证码

引言&#xff1a; 我们生活中登录的时候都要输入验证码&#xff0c;这些验证码是为了增加注册或者登录难度&#xff0c;减少被人用脚本疯狂登录注册导致的一系列危害&#xff0c;减少数据库的一些压力。 毕竟那些用脚本生成的账号都是垃圾账号 本次实践&#xff1a;生成这样的…

Spring Boot - 利用Resilience4j-RateLimiter进行流量控制和服务降级

文章目录 Resilience4j概述Resilience4j官方地址Resilience4j-RateLimiter微服务演示Payment processorPOM配置文件ServiceController Payment servicePOMModelServiceRestConfigController配置验证 探究 Rate Limiting请求三次 &#xff0c;观察等待15秒连续访问6次 Resilienc…

mysql原理--undo日志1

1.事务回滚的需求 我们说过 事务 需要保证 原子性 &#xff0c;也就是事务中的操作要么全部完成&#xff0c;要么什么也不做。但是偏偏有时候事务执行到一半会出现一些情况&#xff0c;比如&#xff1a; (1). 事务执行过程中可能遇到各种错误&#xff0c;比如服务器本身的错误&…