浮点数的表示

简介: 浮点数的表示


一、基本介绍

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

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

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

基数为2的数F FF的浮点数表示为:

F = 2 E × M F = 2^E \times MF=2E×M

浮点数编码的规则:

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

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

详细解释

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

二、IEEE 754标准浮点数

IEEE 754规定单精度浮点数的真值一般表示为:

N = ( − 1 ) s × 2 e − 127 × 1. f N = (-1)^s \times 2^{e-127} \times 1.fN=(1)s×2e127×1.f

单精度浮点数的编码格式由3个字段构成

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

注意点:

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

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 MM不满足1 2 < M < 1 \frac{1}{2} < M < 121<M<1,则是非规格化数需要进行规格化处理。

3.2 浮点数的乘法

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

3.3 浮点数的除法

  1. 被除数、除数一定是规格化数,除数不等于0,若被除数为0,则商必为0
  2. 求商的阶码:E z = E x − E y E_z = E_x - E_yEz=ExEy, 判断商的阶码是否溢出:上溢、下溢
  3. 求商的尾数:M z = M x ÷ M y M_z = M_x \div M_yMz=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

相关文章
初识Redission分布式锁
在微服务系统中,某些场景需要阻塞所有节点的所有线程,对共享资源的访问。比如并发时“超卖”和“余额减为负数”等情况,需要对同一资源进行加锁,这些就需要进行分布式。
初识Redission分布式锁
|
3月前
|
SQL 人工智能 缓存
阿里云百炼产品月刊【2025年11月】
通义千问本月重磅升级:上线10款多模态与语音模型,涵盖ASR、TTS、视觉语言及翻译;MCP市场新增3个云服务,上架24个电商应用模板;推出实训Agent创客活动,助力高效生成电商视觉内容。
915 10
|
3月前
|
安全 小程序 Java
微信支付全流程实战指南
本文从底层逻辑到实战代码,完整覆盖了微信支付Native/JSAPI支付、异步回调、退款、对账等核心能力。在实际项目中,需结合业务场景补充异常监控、资金告警、日志审计等能力,进一步保障支付系统的稳定性和资金安全。
456 6
|
2月前
|
弹性计算 Linux 数据安全/隐私保护
阿里云幻兽帕鲁联机服务器搭建全攻略,速来抄作业!2026新版教程
阿里云推出2026年幻兽帕鲁一键开服教程,提供4核16G(89元/月,支持8人)和8核32G(160元/月,支持20人)配置,10M带宽,自动部署游戏服务。用户只需在STEAM购买游戏,输入服务器地址即可联机畅玩,全流程简单便捷。
616 3
|
3月前
|
人工智能 自然语言处理 数据可视化
从形象到资产:数字人如何在IP、虚拟偶像与电商领域重塑商业价值
数字人正从技术演示迈向规模化商用,成为IP打造、虚拟偶像、电商转化的核心引擎。依托AI驱动与成本降低,其形象生成与内容输出实现高效自动化,广泛应用于知识付费、跨境直播等场景,推动个人品牌与企业营销的数字化升级,逐步演变为可运营的“数字员工”和新型商业基础设施。
|
测试技术
测试用例设计方法之基本路径测试法
基本路径测试法是在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行路径集合,从而设计测试用例的方法,设计出的测试用例要保证在测试中程序的语句覆盖100%,条件覆盖100%
1075 7
测试用例设计方法之基本路径测试法
|
编译器 C语言
C语言中的浮点数:深入探索与应用
C语言中的浮点数:深入探索与应用
2834 1
408计算机组成原理学习笔记——浮点数的表示和运算
408计算机组成原理学习笔记——浮点数的表示和运算
3049 1
408计算机组成原理学习笔记——浮点数的表示和运算
|
前端开发 JavaScript 搜索推荐
打造个人博客网站:从零开始的HTML、CSS与JavaScript之旅
在这个数字时代,拥有一个个性化的网络空间已成为许多人的梦想。本文将引导你了解如何从零开始,使用HTML、CSS和JavaScript创建属于自己的博客网站。我们将探索这些技术的基础概念,并通过实际代码示例展示如何将静态页面转变为动态交互式网站。无论你是编程新手还是希望扩展技能的开发者,这篇文章都将为你提供一条清晰的学习路径。【8月更文挑战第31天】
1140 0

热门文章

最新文章