浮点数存储格式学习:找到非规格数中最大和最小的数
在学习《深入理解计算机系统》的浮点数存储里,我想到一个问题,单精度浮点数中,非规格浮点数最大数是几?
00000000011111111111111111111111
符号位:0
指数域:00000000
小数域:11111111111111111111111
指数域全0,小数域全1,符号位0,这个数应该是非规格数中最大的一个了,那么这个数存在吗?计算机是这样存储的吗?
单精度浮点数:符号位1个,指数位8个,小数位23个,偏置值bias=127,E=1-bias=-126,M=f=(0.11111111111111111111111)2
根据存储定义:浮点数V=(-1)sM2E,V=(0.11111111111111111111111)2 * 2-126
让我们开始编程查看一下吧:
#include <cstdio> int main(){float a=0.5,c=0.5;//第一个for是将a的值累加到(0.111...11),注意0.5在二进制下就是0.1for(int i=0;i<22;i++){c*=0.5;a=a+c;}//第二个for将a和2-126相乘。for(int i=0;i<126;i++){a*=0.5;}unsigned int b=*(int *)&a;for(int i=0;i<32;i++){printf("%d",(b>>(31-i))&1?1:0);}printf("\nb=%d\n",b);return 0; }
输出:
vagrant@ubuntu-bionic:~$ ./t 00000000011111111111111111111111 b=8388607 //震惊,连b的值都有意义了,8388607=223-1
解释:第一个for中,将循环次数设为22,是因为a本身有一个1,只需再加22个就够了。更有意思的是:如果把次数改为23,则全0,也就是浮点数的0了,如果改为24,那么就是规格数中最小的一个喽,呵呵,有意思,终于理解《深解》说的平滑过渡啥意思了。
那么这个最大的非规格浮点数到底是多少呢?在上面程序加上一句:
printf("%.200f\n",a);
输出:
vagrant@ubuntu-bionic:~$ ./t 00000000011111111111111111111111 a=0.00000000000000000000000000000000000001175494210692441075487029444849287348827052428745893333857174530571588870475618904265502351336181163787841796875000000000000000000000000000000000000000000000000000
最后面的0可以删除,这样是为了看着方面,确认没数了。这个数最大的非规格浮点数是:
a=0.00000000000000000000000000000000000001175494210692441075487029444849287348827052428745893333857174530571588870475618904265502351336181163787841796875
数字前面有37个0,a*1038约等于1.1755,这还是非规格数里面最大的一个,晕。
那么最小的非规格数是多少呢?基本和前面同理:
#include <cstdio> int main(){float a=0.5;for(int i=0;i<22;i++){a*=0.5;}for(int i=0;i<126;i++){a*=0.5;}unsigned int b=*(int *)&a;for(int i=0;i<32;i++){printf("%d",(b>>(31-i))&1?1:0);}printf("\na=%.200f\n",a);printf("\nb=%d\n",b);return 0; }
输出:
vagrant@ubuntu-bionic:~$ ./t1 00000000000000000000000000000001 a=0.00000000000000000000000000000000000000000000140129846432481707092372958328991613128026194187651577175706828388979108268586060148663818836212158203125000000000000000000000000000000000000000000000000000b=1
这就是浮点数,如果你懂它,它也很精确的。
转载于:https://www.cnblogs.com/litifeng/p/10488908.html
浮点数存储格式学习:找到非规格数中最大和最小的数相关推荐
- python找到列表中最大和最小的数
def lookup_min_max(numbers):if numbers == []:returnmin_num = numbers[0]max_num = numbers[0]for numbe ...
- 寻找神秘4位数:在0-9十个数字中任意选择4个数字,如选2,9,8,4这四个数字,组成最大的数是9842,最小的数是2489,然后相减,再把得到的4位数组成的最大与最小值相减
寻找神秘4位数:在0-9十个数字中任意选择4个数字,如选2,9,8,4这四个数字,组成最大的数是9842,最小的数是2489,然后相减,再把得到的4位数组成的最大与最小值相减,在这样重复的过程中,你能 ...
- c编程:求出4#215;4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和。...
//求出4×4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和 #include <stdio.h> int main() {int sum=0;int max,mi ...
- 计算机视觉与深度学习 | 检测和测量图像中的圆形目标(数钢筋)
================================================ 博主github:https://github.com/MichaelBeechan 博主CSDN:h ...
- 复杂网络 介数中心性 java_ego network 介数中心性计算
下面是求节点介数的代码,介数就是指经过一个点的最短路径的比例,在计算复杂网络中节点重要性的时候会用到. /** * 用来计算介数 * 要计算所有的最短路径,用DIJ计算最短路径的时候我们可以发现一个规 ...
- Java从键盘输入若干数_用java编程序:从键盘输入若干个整数,输出这些数中大于其平均值的数。...
展开全部 引用1楼 christal yhy的答案,考虑到浮点数的存在,特在此基础上优化一下,代码如下: public static void main(String[] args) { Scanne ...
- 把数组排列成最小的数(详解)
题目: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 题目解析: ...
- (C++)输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。要求用3个函数实现,分别为输入10个数、进行处理、输出10个数。要求使用指针的方法进行处理。
#include<cstdio> //输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换.要求用3个函数实现,分别为输入10个数.进行处理.输出10个数.要求使用指针 ...
- 面试题45. 把数组排成最小的数
题目: 面试题45. 把数组排成最小的数 题解: 1. 题解一: 2. 题解二: * 解题思路:* 先将整型数组转换成String数组,然后将String数组排序,最后将排好序的字符串数组拼接出来.关 ...
最新文章
- LIVE 预告 | CVPR 2021 预讲 · 旷视专场,覆盖目标检测、蒸馏、图像降噪、人体姿态估计等...
- 【Boost】boost库asio详解5——resolver与endpoint使用说明
- 选项卡的制作和注意要点
- 罗永浩确认12月初开发布会 不是手机也不是电子烟
- Qt读取ini文件中文乱码问题
- php和fastapi,FastAPI快速开始
- MIT App Inventor使用与入门教程
- java数组排序方法
- 只需简单一步,android自带的示例程序 BluetoothChat 变蓝牙串口助手
- 超细节的QT设计完整界面布局的流程-新手向
- 细分领域:偏门的色流玩法+简单的色流变现套路
- iOS各种证书之间详解关于Certificate、Provisioning Profile、App ID的介绍及其之间的关系
- 也许你不知道:越自我,越自由!
- linux运行directory,我在linux里用命令出来is a directory是怎么回事
- Mac突然中文输入法框不见了??
- 知到网课异彩纷呈的民族文化期末考试单元试题答案分享!
- (三)java流程控制语句
- 华特迪士尼宣布媒体和娱乐发行部门亚太区管理团队的一系列任命
- SDUSTOJ1670 Problem C: 农夫果园
- matlab数字图像实验报告,数字图像处理实验报告(matlab)
热门文章
- html将图片做成标签,HTML(图片标签)
- java记录每个元素出现几次_哪位师傅帮用Java我计算出数组中每个元素出现的次数...
- mysql 去重求总数_Mysql获取去重后的总数
- 怎么在html中加判断,css样式里面如何做判断
- mysql-connector-net-6.7.4.msi,在ActiveReports中使用MySQL数据库
- 【深度学习】CNN在大规模图像数据集上的应用(基于keras和MNIST)
- 【Deep Learning笔记】一个很好的神经网络相关定义(看不懂你来打我)
- 搭建Ubuntu18.04+Anaconda3.x+Pycharm+SimpleITK(二)
- 交互式SQL(数据定义部分)
- java API(String类 和 StringBuffer类)