计算机中的浮点数(二)

news2024/11/15 2:19:05

IEEE 754-2008 标准(二进制)

计算机中的浮点数(一)-CSDN博客文章浏览阅读188次,点赞12次,收藏12次。这篇文章介绍了计算机系统中浮点数的正式定义,关于浮点数的介绍总共分两篇文章,这是第一篇。https://blog.csdn.net/daduzimama/article/details/141902866

IEEE 754的参数说明:

        书接上文,IEEE 754-2008标准(以下简称标准754)对底(radix)β指数e(exponents)的最小/大值e_{min}e_{max}做了进一步规定。其中:

1,底数β只能是2或者是10,也就是说该标准只支持二进制和十进制

2,指数e的极限范围必须符合:e_{min}=1-e_{max}

        该标准定义了一些interchange formats交换格式,这些交换格式对所有的比特位都进行了编码,使得他们彼此之间能够在不同平台之间进行无损的数据交换。在所有的交换格式中标准定义了5个basic formats基础格式: 三个32位,64位和128位的二进制格式,以及两个64位和128位的十进制格式。

二进制交换格式的主要参数
十进制交换格式的主要参数


浮点数的编码方式:

        如上图所示,浮点数的编码使用了1个符号位(sign)S、一个宽度为W_{E}位的指数字段E,以及一个p−1位有效数字的尾数(trailing significand)字段T。我们来回顾一下“有效数字的尾数(或者简称尾数)”是什么意思?在上一篇文章中,介绍了浮点数的正式定义后,又介绍了正规数次正规数。其中提到了“如果有一种方法,特别是在指数字段中。。。隐藏位约定(leading bit convention/implicit bit convention/hidden bit convention)”。

        事实上,在标准754中就使用了这种方法。在二进制浮点数的表示中,对常规数(normal number)而言,他的有效数字(significand)的第一位必然是“1”。而对于相对少见的数(sub-normal number)而言,他的有效数字(significand)的第一位必然是“0”。因此,不论表示成normal number还是sub-normal number都没必要存储这一位,而是把更多的空间用来存储其他有用信息。即,只储小数点后面的p−1位:这就是有效数字的尾数(在有的地方也称“分数”)。这种不存储有效数字最左边一位的方式被称为“前导位约定(leading bit convention)”或“隐藏位约定(hidden bit convention)”。

        简而言之,如果有效数位是24位,实际只储存23位。


二进制浮点数的编码方式:

        基于上面的三个不同字段,E是指数字段的位组成的整数,T为由尾数字段的位组成的整数,S为表示符号位的整数,一个数用二进制浮点数来表示,可表示为(S,E,T)的函数,具体编码方式如下,主要是由E和T这两个字段所共同决定的:

        1,如果E=2^{W_{E}}-1(即,指数字段全为1)且T\neq 0,则浮点数为NaN(not a number)。这个NaN是quiet NaN或者signaling NaN二者中的一种。其中,quiet NaN特指无效操作(例如,\sqrt{-5.0}这种操作)。而signaling NaN则特指操作异常。

        2,如果E=2^{W_{E}}-1(指数字段全为1)且T=0(尾数字段全为0),则专门用于表示正无穷或者负无穷

(-1)^{S}\times (\infty )

        3,如果E=0T=0,表示带符号的零

(-1)^{S}\times (0)

        4,如果E=0T\neq 0,这种情况专门用于表示Sub-normal number相对少见的数

(-1)^{S}\times 2^{e_{min}}\times (0+T\cdot 2^{1-p})

        5,只有E在1\leq E\leqslant 2^{W_{E}}-2之间的时候,才被用于表示normal number常规数

(-1)^{S}\times 2^{E-b}\times (1+T\cdot 2^{1-p})

   

        其中,b表示偏移量(bias),且b=e_{max}=2^{W_{E}}-1。对于不同的交换格式b的值也随之而改变。   


单精度浮点数的常规数表示(normal number)

        就二进制单精度而言,暂且先不考虑前面提到的NaN,正负无穷大等等,我们先用一个例子来看看32位单精度浮点数的表示方法。

        首先,根据标准754给定的参数单精度浮点数共有32bit:

32=1+8+23

        他们分别是1bit的符号位,8bit的指数,23bit的尾数(不需要保存隐藏位,隐藏位由指数字段指出)。精度p=24,log_{10}(2^{24})\approx 7.225,大约相当于是7.225个十进制数字的精度。

        假设一个数N在32位浮点数的系统中被表示/编译(encoding)为:

        1,从左至右逐一解码,先看符号位S,符号位为0,根据公式得到

(-1)^{S}=(-1)^{0}=1

这说明N是一个大于等于0的数(不一定是正数,可能是0)。

        2,其次再看指数E,指数部分既不是00000000_{2}也不是11111111_{2},参考标准754所定义的表格,这说明N是一个常规数(normal number)。同时,这也指出了尾数的隐含位一定是1(sub-normal number的隐含位是0)。

        表示常规数要使用标准754定义的公式:

(-1)^{S}\times 2^{E-b}\times (1+T\cdot 2^{1-p})

         再度参考标准可知,在表示常规数时需要用到偏移量b(bias),且b=e_{max}=127。因此,实际指数应该是:

E-b=01101011_{2}-127_{10}

其中: 

 01101011_{2}=1\cdot 2^{6}+1\cdot 2^{5}+1\cdot 2^{3}+1\cdot 2^{1}+1\cdot 2^{0}=107

Python code:

1*(2**6)+1*(2**5)+1*(2**3)+1*(2**1)+1*(2**0)

E-b=107_{10}-127_{10}=-20_{10}

        即:

 2^{-20}=0.00000095367431640625_{10}

 Python code:

2**(-20)

        3,有效数字的尾数(trailing significand)+隐含位(hidden bit)得到真正的有效数字:

1+T\cdot 2^{1-p}=1_{2}+01010101010101010101010_{2}\cdot 2^{1-24}=1_{2}+01010101010101010101010_{2}\cdot 2^{-23}=1_{2}+0.01010101010101010101010_{2}

        这里我们分别把二进制数的整数部分和小数部分转化到十进制,对于小数部分而言有:

0.01010101010101010101010_{2}=0\times 2^{-1}+1\times 2^{-2}+...+0\times 2^{-23}=0.33333325386047363_{10}

        对于整数部分而言:

1\times 2^{0}=1_{10} 

        最终得到:

 1_{10}+0.33333325386047363_{10}=1.33333325386047363_{10}

Python代码:

1/(2**2)+1/(2**4)+1/(2**6)+1/(2**8)+1/(2**10)+1/(2**12)+1/(2**14)+1/(2**16)+1/(2**18)+1/(2**20)+1/(2**22)

        4,合并所有计算结果,最终得到十进制的原始数N

(-1)^{S}\times 2^{E-b}\times (1+T\cdot 2^{1-p})=1\times 0.00000095367431640625_{10}\times1.33333325386047363_{10}=0.0000012715656794171082_{10}


单精度浮点数相对少见的数的表示(sub-normal number)

        假设一个数N在32位浮点数的系统中被表示/编译(encoding)为:

        1,还是从左至右逐一解码,先看符号位S,符号位为1,根据公式得到

(-1)^{S}=(-1)^{1}=-1

这说明N是一个负数。

        2,再看指数E。参考标准754所定义的表格,指数部分E是00000000_{2}且有效数字的尾数T不为0,这说明N是一个相对少见的数(sub-normal number)。同时,这也进一步指出了尾数的隐含位一定是0。

表示sub-normal number要使用标准754定义的公式:

(-1)^{S}\times 2^{e_{min}}\times (0+T\cdot 2^{1-p})

其中e^{min}=-126,代入上式得到: 

-1\times 2^{-126}\times (0+T\cdot 2^{1-p})

        3,有效数字的尾数(trailing significand)+隐含位(hidden bit)得到真正的有效数字:

0+T\cdot 2^{1-p}=0_{2}+01100000000000000000000_{2}\cdot 2^{1-24}=0_{2}+01100000000000000000000_{2}\cdot 2^{-23}=0.01100000000000000000000_{2}

        把二进制小数转换为十进制得到:

 0.01100000000000000000000_{2}=1\times 2^{-2}+1\times 2^{-3}=0.375_{10}

Python代码:

1/(2**2)+1/(2**3)

        4,合并所有计算结果

(-1)^{S}\times 2^{e_{min}}\times (0+T\cdot 2^{1-p})=-1\times 2^{-126}\times 0.375=-4.408103815583578\times 10^{-39}

Python代码:

-1*2**(-126)*0.375


 单精度normal number所能表示的极限

 

        根据标准754定义的用于表示normal number的公式:

(-1)^{S}\times 2^{E-b}\times (1+T\cdot 2^{1-p})

        最小的正normal number(the smallest positive normal number)是由规定范围内所允许的最小指数E和最小的尾数T所决定的,即令E=00000001,T等于0时的数:

(-1)^{S}\times 2^{E-b}\times (1+T\cdot 2^{1-p})=1\times 2^{1-127}\times (1+0\cdot 2^{1-p})=2^{-126}

 2^{-126}\approx 1.175\times 10^{-38}

        最大的正normal number(the largest finite floating-point number)是由规定范围内所允许的最大的指数和最大的尾数确定的,即,令E=11111110,T为全1时的数:

(-1)^{S}\times 2^{E-b}\times (1+T\cdot 2^{1-p})=1\times 2^{254-126}\times (1+T\cdot 2^{1-24})=2^{127}\times(1+11111111111111111111111_{2}\cdot 2^{1-24})=2^{127}\times(1+0.11111111111111111111111_{2})

        又因为在二进制中:

1.000_{2}-0.001_{2}=0.111_{2}

        故而上面的计算公式可改为:

 (-1)^{S}\times 2^{E-b}\times (1+T\cdot 2^{1-p})=1\times 2^{254-126}\times (1+T\cdot 2^{1-24})=2^{127}\times(1+11111111111111111111111_{2}\cdot 2^{1-24})=2^{127}\times(1+0.11111111111111111111111_{2})=2^{127}\times(1+1-0.00000000000000000000001_{2})=2^{127}\times(1+1-1\times 2^{-23}_{2})=2^{127}\times(2-1\times 2^{-23}_{2})

        最终得到:

 (-1)^{S}\times 2^{E-b}\times (1+T\cdot 2^{1-p})=1\times 2^{254-126}\times (1+T\cdot 2^{1-24})=2^{127}\times(2-1\times 2^{-23}_{2})\approx3.4028234663852886\times 10^{38}


单精度sub-normal number所能表示的极限

         sub-normal number常用于表示非常小的数,所以一般情况下,他的所能表示的极限往往特指他能表示的最小的数。根据标准754定义的用于表示sub-normal number的公式:

(-1)^{S}\times 2^{e_{min}}\times (0+T\cdot 2^{1-p})=1\times 2^{-126}\times (0+T\cdot 2^{1-p}) 

        最小的正normal number(the smallest positive sub-normal number)由最小的指数和最小的尾数确定,其中,E=00000000,T为000...1的数:

1\times 2^{-126}\times (0+T\cdot 2^{1-p})=2^{-126}\times (T\cdot 2^{1-p})=2^{-126}\times 00000000000000000000001_{2}\cdot 2^{1-24}=00000000000000000000001_{2}\cdot 2^{-126+1-24}=00000000000000000000001_{2}\cdot 2^{-149}

        把二进制转换为十进制后,最终得到:

 00000000000000000000001_{2}\cdot 2^{-149}=1_{10}\cdot 2^{-149}\approx 1.401298464324817\times 10^{-45}


参考: 


 双精度浮点数的常规数表示

        首先,根据标准754给定的参数双精度浮点数共有64bit:

64=1+11+52

        他们分别是1bit的符号位,11bit的指数,52bit的尾数(不需要保存隐藏位,隐藏位由指数字段指出)。精度p=53,log_{10}(2^{53})\approx 15.955,大约相当于是15.96个十进制数字的精度。

        浮点数的表示太长了,书上没有给例子我这里也不再给了。具体都可以参考32bit单精度的转换方法。 


双精度normal number所能表示的极限

         根据标准754定义的用于表示normal number的公式:

(-1)^{S}\times 2^{E-b}\times (1+T\cdot 2^{1-p})

        最小的正normal number(the smallest positive normal number)是由规定范围内所允许的最小指数E和最小的尾数T所决定的,即令E=000...01,T等于0时的数:

(-1)^{S}\times 2^{E-b}\times (1+T\cdot 2^{1-p})=1\times 2^{1-1023}\times (1+0\cdot 2^{1-p})=2^{-1022}

 2^{-1022}\approx 2.2250738585072014\times 10^{-308}

        最大的正normal number(the largest finite floating-point number)是由规定范围内所允许的最大的指数和最大的尾数确定的,即,令E=111...10,T为全1时的数:

 (-1)^{S}\times 2^{E-b}\times (1+T\cdot 2^{1-p})=2^{1023}\times(2-1\times 2^{-52}_{2})\approx1.7976931348623157\times 10^{308}


 双精度sub-normal number所能表示的极限

         sub-normal number常用于表示非常小的数,所以一般情况下,他的所能表示的极限往往特指他能表示的最小的数。根据标准754定义的用于表示sub-normal number的公式:

(-1)^{S}\times 2^{e_{min}}\times (0+T\cdot 2^{1-p})=1\times 2^{-1022}\times (0+T\cdot 2^{1-p}) 

        最小的正normal number(the smallest positive sub-normal number)由最小的指数和最小的尾数确定,其中,E=00...000,T为000...01的数:

1\times 2^{-1022}\times (0+T\cdot 2^{1-p})=2^{-1022}\times (T\cdot 2^{1-p})=2^{-1022}\times 0000...01_{2}\cdot 2^{1-53}=0000...01_{2}\cdot 2^{-1022+1-53}=0000...01_{2}\cdot 2^{-1074}

        把二进制转换为十进制后,最终得到:

 00000000000000000000001_{2}\cdot 2^{-1074}=1_{10}\cdot 2^{-1074}\approx 4.9406564584124654417656879286822\times 10^{-324}

By the way:

        算到这个地方的时候,我发现python基本上已经算不出来了,需要引入“decimal”模块进行高精度运算。

python code: 

import decimal

# 设置精度为50位
decimal.getcontext().prec = 50

# 计算 1/(2**1074)
result = decimal.Decimal(1) / decimal.Decimal(2**1074)

print(result)


(全文完) 

--- 作者,松下J27

参考文献(鸣谢): 

1,《Handbook of floating-point arithmetic》 ,second edition, Jean-Michel Muller

2,《Elementary Functions Algorithms and Implementation》,Jean-Michel Muller

3,https://en.wikipedia.org/wiki/Floating-point_arithmetic#IEEE_754:_floating_point_in_modern_computers

4,https://en.wikipedia.org/wiki/Single-precision_floating-point_format

5,https://en.wikipedia.org/wiki/Double-precision_floating-point_format

版权声明:所有的笔记,可能来自很多不同的网站和说明,在此没法一一列出,如有侵权,请告知,立即删除。欢迎大家转载,但是,如果有人引用或者COPY我的文章,必须在你的文章中注明你所使用的图片或者文字来自于我的文章,否则,侵权必究。 ----松下J27  

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

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

相关文章

动手学深度学习(pytorch)学习记录30-含并行连接的网络(GoogLeNet)[学习记录]

目录 GoogLeNetInception块GoogLeNet模型训练模型 GoogLeNet GoogLeNet,也称为Inception v1,是由Google团队在2014年提出的深度学习模型,它在当年的ImageNet竞赛中取得了显著的成绩。GoogLeNet的设计引入了多个创新点,包括Incept…

Spring Boot实战-文章管理系统(1.用户相关接口)

一、用户相关接口 1.注解 RestController:是一个组合注解,它结合了 Controller 和 ResponseBody 注解的功能(就相当于把两个注解组合在一起)。 在使用 RestController 注解标记的类中,每个方法的返回值都会以 JSON 或…

【数据结构】带你初步了解排序算法

文章目录 1. 排序的概念及运用1.1 概念1.2 运用 2. 常见的排序算法2.1 插入排序2.1.1 直接插入排序(简单插入排序)2.1.2 希尔排序 2.2 选择排序2.2.1 直接选择排序(简单选择排序)2.2.2 堆排序 2.3 交换排序2.3.1 冒泡排序2.3.2 快…

python | 2行命令解决pip模块不存在问题

一、报错情况 有时,在执行 pip 更新命令后,会提示更新失败或错误警告。 报错提示如下: 然后,再次使用 pip 安装命令时,会提示 pip 模块找不到或不存在: ModuleNotFoundError: No module named pip 导致…

在线IP代理检测:保护您的网络安全

在互联网飞速发展的今天,越来越多的人开始意识到网络安全和隐私保护的重要性。在线IP代理检测工具作为一种有效的网络安全手段,能够帮助用户识别和检测IP代理的使用情况,从而更好地保护个人隐私和数据安全。本文将详细介绍在线IP代理检测的相…

SQL数据库(MySQL)

一、在Ubuntu系统下安装MySQL数据库 1、更新软件源,在确保ubuntu系统能正常上网的情况下执行以下命令 sudo apt-get update 2、安装MySQL数据库及相关软件包 # 安装过程中设置root用户的密码 123456 sudo apt-get install mysql-server ​ # 安装访问数据库的客…

Rsync——远程同步

目录 一、rsync远程同步概述 1、rsync 简介 2、rsync的同步方式 3、rsync的备份方式 4、rsync与cp、scp对比 二、常用rsync命令 1、基本格式 2、配置源的两种表达方法 三、搭建rsync下行同步 1、搭建环境 2、配置rsync源服务器(172.16.88.44)…

出版学术专著需要具备哪些条件?

出版学术专著通常需要具备以下条件: 一、学术价值 1. 创新性 - 你的专著应在研究主题、方法、观点等方面具有一定的创新性。这可以是提出新的理论框架、发现新的现象、采用新的研究方法或对已有理论进行新的阐释和拓展。 - 例如,在某一特定学科领域中&…

【北京迅为】《STM32MP157开发板使用手册》- 第二十七章Cortex-M4按键实验

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器,既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构,主频650M、1G内存、8G存储,核心板采用工业级板对板连接器,高可靠,牢固耐…

跟《经济学人》学英文:2024年09月07日这期 What to read about the British economy

What to read about the British economy Britain used to be the world’s richest country. These six books explain how it came to be, and why it is no longer 原文: IN RECENT YEARS the British economy has tended to be in the news for the wrong re…

凯伦股份融合®️TMP复合瓦系统实力硬扛摩羯台风

第11号台风“摩羯”,今年以来登陆我国的最强台风,也是继2014年“威马逊”之后登陆我国的最强台风。 沿海多地发布防风Ⅰ级应急响应,多市启动落实“六停”措施。面对17级台风,工商业厂房遭受严重的破坏。据前方报道,当地…

Vue实用操作篇-1-第一个 Vue 程序

安装 Vue 非常的简便&#xff0c;只需下载好 Vue 对应的 .js 文件&#xff0c;在 html 中引入 vue.js 即可使用 Vue 下载好了 vue.js 我们便可以编写我们的第一个 vue 程序了 <!doctype html> <html lang"zh-CN"><head><meta charset"utf…

【数据结构】十大经典排序算法总结与分析

文章目录 前言1. 十大经典排序算法分类2. 相关概念3. 十大经典算法总结4. 补充内容4.1 比较排序和非比较排序的区别4.2 稳定的算法就真的稳定了吗&#xff1f;4.3 稳定的意义4.4 时间复杂度的补充4.5 空间复杂度补充 结语 前言 排序算法是《数据结构与算法》中最基本的算法之一…

计算机视觉(一)—— 特刊推荐

特刊征稿 01 期刊名称&#xff1a; Computer Vision for Smart Cities 截止时间&#xff1a; 提交截止日期&#xff1a;2024 年 12 月 31 日 目标及范围&#xff1a; 以下是一些潜在的主题&#xff1a; 城市交通和交通管理&#xff1a; • 车辆检测和跟踪以实现高效的交通流…

相机SD卡删除的照片可以恢复吗?6个方法,快速找回删除照片!

相机SD卡的照片在相机中误删了&#xff0c;有什么恢复办法吗&#xff1f;今天我要和大家分享一些关于如何恢复相机SD卡中删除的照片的方法。相信很多摄影爱好者都遇到过不小心删除了重要照片的情况&#xff0c;这时候我们该怎么办呢&#xff1f;别担心&#xff0c;下面我将为大…

野兔在线工具箱系统(市面上最强最多)最新版本更新2024.9

野兔在线工具箱系统&#xff0c;采用最新ThinkPHP8框架开发完成&#xff0c;也是基于YETUADMIN开发的工具箱系统&#xff0c;这次野兔在线工具系统更新&#xff0c;更新了几个新的功能模块&#xff0c;和已知的问题&#xff0c;修复系统部分功能。 程序开发 程序名称&#xf…

【生产力必备工具】GPU加速计算的首选云服务——蓝耘GPU(点击我的链接注册登录,可获50使用卷)

点击下面我的链接注册并登录&#xff0c;可获50使用卷&#xff1a;https://cloud.lanyun.net/#/registerPage?promoterCode11f606c51ehttps://cloud.lanyun.net/#/registerPage?promoterCode11f606c51e获得广泛丰富的NVIDIA高端GPU选择。高可配置高可用&#xff0c;专为大规模…

Linux之CentOS 7.9-Minimal部署Oracle 11g r2 安装实测验证(桌面模式)

前言: 发个之前的库存… Linux之CentOS 7.9-Minimal部署Oracle 11g r2 安装实测验证(桌面模式) 本次验证的是CentOS_7_Minimal-2009桌面模式来部署Oracle 11g r2,大家可根据自身环境及学习来了解。 环境:下载地址都给你们超链好了 1、Linux系统镜像包: 1.1 CentOS-7-x86_…

系统出现d3dcompiler_47.dll缺失怎么修复?总结6种d3dcompiler_47.dll修复方法

在现代电脑游戏中&#xff0c;​d3dcompiler_47.dll​ 文件是一个非常重要的组件&#xff0c;它用于DirectX应用程序的编译。然而&#xff0c;许多用户在尝试运行游戏或应用程序时&#xff0c;都会遇到“d3dcompiler_47.dll缺失”的错误。本文将为您提供解决此问题的详细步骤和…

2024年江西省职业院校技能大赛赛项规程 (简要概括)

这里写目录标题 一、赛项说明二、大赛时间三、参赛资格四、名额分配五、竞赛规程六、选拔方式七、报名办法八、奖项设置九、大赛QQ群十、资格审查 一、赛项说明 二、大赛时间 2024年十月至十二月 具体时间 地点 参考 赛项信息表 三、参赛资格 四、名额分配 五、竞赛规程 六、…