浮点数的储存

浮点数的储存

  • 一.浮点数的三段式(S,E,M)
    • 1.如何放入
    • 2.如何取出
  • 二.为什么浮点数不能直接比较
  • 三.解释第一个问题

在这里插入图片描述

我们都知道整形在内存中是按照补码的形式储存的,但是浮点数的储存却和整数的截然不同,浮点数没有所谓是原反补并且浮点数的大小很多情况下不能直接比较,这是怎么一回事呢?

引子

int main()
{
 int n = 9;
 float *pFloat = (float *)&n;
 printf("n的值为:%d\n",n);
 printf("*pFloat的值为:%f\n",*pFloat);
 *pFloat = 9.0;
 printf("num的值为:%d\n",n);
 printf("*pFloat的值为:%f\n",*pFloat);
 return 0;
}

在这里插入图片描述

这是怎么回事呢?接下来得提到浮点数的储存了。

一.浮点数的三段式(S,E,M)

1.如何放入

根据国际标准IEEE(电气和电子工程协会) 754,任意一个二进制浮点数V可以表示成下面的形式

(-1)^S * M * 2^E
(-1)^S表示符号位,当S=0,V为正数;当S=1,V为负数。
M表示有效数字,大于等于1,小于2。
2^E表示指数位。

举例来说十进制的20.0写成二进制是10100.0,那么换成浮点数一般储存方式是(-1)^0*1.0100 *2 ^4 。相当于S=0,M=1.0100,E=4。简而言之就是前面的-1用来判断正负,后面全部转化为科学计数法。

再举个例子十进制的-25.5写成二进制是11001.1(注意小数点后第一位的权重是2的-1次方,也就是0.5)。那么转换为一般浮点数存储方式就是(-1)* 1 *1.1001 *2^4。也就是S=1,M=1.1001,E=4。

具体的放入方式

在这里插入图片描述
在这里插入图片描述

S和 M的储存

S是用来判断正负的,是正就存0是负就存1。M我们前面也提到过必须先转换成按2的科学计数法,也就是2>M>=1(其实也很好理解,毕竟二进制最大就是2嘛)。

IEEE 754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的xxxxxx部分。比如保存1.01的时候,只保存01,等到读取的时候,第一位的1加上去。这样做的目的,是节省1位有效数字。以32位浮点数为例,留给M只23位,将第一位的1舍去以后,等于可以保存24位有效数字。

以上面的20.0为例,就相当于M=1.0100,只是存入了01000。

E的储存

首先要明确的是E是无符号整数,这意味着,如果E为8位,它的取值范围为0~ 255;如果E为11位,它的取值范围为0~2047。

但在实际中我们知道E是可能出现负数的(例如0.5写成科学计数法是1.0 * 2^-1 ,那么此时E=-1)。所以IEEE 754规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。比如,2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即0001001。

一个例子

在这里插入图片描述

在这里插入图片描述

2.如何取出

取出主要分为三种情况。

一般情况(E不为全0或全1)

此时就是如何存入就如何取出。

例子
在这里插入图片描述

E全为0

这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0,以及接近于0的很小的数字。

E全为1

这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s)

二.为什么浮点数不能直接比较

可以发现我之前写的数全是20.0,·25.5这种能够被2除尽的数。那么如果是3.14这种数怎么写呢?

这是不能精确的转换为二进制,3.14中3可以用11表示但0.14呢?我们只能近似的写成001…010110…无论我们写多少为都不能精确的表达0.14。但如果写的位数越多那么就越接近0.14这个值,这也是为什么double比float精度高的原因。

三.解释第一个问题

在这里插入图片描述

二进制序列本身是没有任何意义的,当我们用不同方式去看这个序列时,该序列才被赋予了特定的含义。所以在使用时我们需要以什么方式存就以什么方式拿,不然会出现乱序。

总结:浮点数存储就是先将其化为二进制序列,然后再换成科学计数法,之后再分别按S,E,M存入不够位数后面补0。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实现类似 Word 协同编辑--Canvas-Editor

前言 对于word的协同编辑,已经构思很久了,但是没有找到合适的插件。今天推荐基于canvas/svg 的富文本编辑器 canvas-editor,能实现类似word的基础功能,如果后续有更好的,也会及时更新。 Canvas-Editor效果图: 官方文…

重学SpringBoot3-WebMvcAutoConfiguration类

重学SpringBoot3-WebMvcAutoConfiguration类 是什么什么用生效条件作用 自定义配置的三种方式自定义配置举例1. 自定义 DispatcherServlet 配置2. 静态资源配置3. 自定义MVC配置4. 消息转换器5. 异常处理 是什么 org.springframework.boot.autoconfigure.web.servlet.WebMvcAut…

【QT6】打开项目 .pro 一堆报错 但是程序可以运行 打开别人的QT项目后,全是报错

报错环境 我通过在网上拷贝的项目, 然后打开pro文件 build项目 你会发现各种报错 无缘无故的报错 明明环境已经没问题了 解决方案 首先是提示no valid settings file could be found,这个错误很好解决,删除项目目录下的.user文件&#xff…

线性代数笔记14--投影

1. 一维空间投影 p X A e B − p B − X A A ⊤ e 0 A ⊤ ( B − X A ) 0 X A ⊤ A A ⊤ B X A ⊤ B A ⊤ A p X A A A ⊤ B A ⊤ A pXA\\ eB-pB-XA\\ A^{\top}e0\\ A^{\top}(B-XA)0\\ XA^{\top}AA^{\top}B\\ X\frac{A^{\top}B}{A^{\top}A}\\ pXAA\frac{A^{\top}B}{A^…

域名交易系统源码 无需授权即可正常使用,带后台,附带系统搭建教程

搭建教程 数据库配置文件 config/config.php 后台 http://域名/ymadmin 用户:admin 密码:aa.798yyds.top PHP选择5.6 伪静态: 伪静态默认是Apache 伪静态转换:http://tool.bolgk.eu.org/htaccess2nginx/ 其他打不开请根据伪静态设…

Android屏幕共享-硬编码硬解码

Android屏幕共享-硬编码硬解码 说起Android之间的屏幕共享,第一次接触会比较陌生,不过大家多少有了解过ffmpeg,看上去是不是很熟悉?ffmpeg是一套处理音视频的开源程序,但对于C了解较少的同学,编译起来很复杂…

鸿蒙系统:揭秘前端开发的新机遇

众所周知,华为开发者大会2023,宣布不再兼容安卓,同时宣布了“鸿飞计划”,欲与iOS、安卓在市场三分天下,这对中国国产操作系统而言,具有划时代的意义。 鸿蒙应用开发的兴起&发展 鸿蒙操作系统是华为自…

旅游陪同翻译,英译中需要具备什么能力!

随着中国旅游业的蓬勃发展,越来越多的外国游客选择踏足这片充满魅力的土地。然而,语言障碍常常成为他们探索中国文化的绊脚石。在这时,旅游陪同翻译应运而生,为游客提供了便捷的语言沟通服务,让他们的旅程更加顺畅和愉…

NFT Insider #122:OpenSea与科切拉音乐节合作推出NFT系列,Flowty联合创始人购入勒布朗・詹姆斯NFT

引言:NFT Insider由NFT收藏组织WHALE Members (https://twitter.com/WHALEMembers)、BeepCrypto (https://twitter.com/beep_crypto) 联合出品,浓缩每周NFT新闻,为大家带来关于NFT最全面、最新鲜、最有价值的讯息。每期周报将从NFT市场数据&a…

借着ChatGPT的人机交互聊聊长连接

ChatGPT这两年可谓风靡全球,尤其是最近Sora视频模型的横空出世以及claude 3模型所具备的浅意识,更是像打开了新世界的大门。本文就从ChatGPT的网页聊天开始聊起(有蹭热度之嫌,哈哈),聊聊长连接的发展历程和…

13 OpenCv自定义线性滤波

文章目录 卷积算子示例 卷积 卷积是图像处理中一个操作,是kernel在图像的每个像素上的操作。Kernel本质上一个固定大小的矩阵数组,其中心点称为锚点(anchor point) 把kernel放到像素数组之上,求锚点周围覆盖的像素乘积之和(包括锚…

几种常见的python开发工具

​ Python是一种功能强大且易于学习的编程语言,被广泛应用于数据科学、机器学习、Web开发等领域。随着Python在各个领域的应用越来越广泛,越来越多的Python开发工具也涌现出来。但是,对于新手来说,选择一款合适的Python开发工具可…

vue3引入高德地图

首先注册高德key https://console.amap.com/dev/key/a vue项目中安转地图包 pnpm i amap/amap-jsapi-loader -S 先说最重要核心,踩雷过 页面中需写入以下代码,现在注册的高德key要求强制写入安全密钥 window._AMapSecurityConfig {securityJsCode…

9、字符串插入和删除

#include <iostream>using namespace std;void test01 () {string s "hello";s.insert (1, "111");cout << s << endl;s.erase(1, 3);cout << s << endl; }int main () {test01();return 0; } 总结&#xff1a; 插入和删除…

基于SVM模型的网络入侵检测模型训练与评估(NSL-KDD数据集)

简介 针对网络安全领域的NSL-KDD数据集进行分类任务的预处理和模型训练、以及超参数调优。 数据预处理 读取并解析数据集&#xff1b;检查并删除指定列&#xff08;outcome&#xff09;的缺失值&#xff1b;对类别型特征&#xff08;protocol_type, service, flag&#xff0…

Linux第73步_学习Linux设备树和“OF函数”

掌握设备树是 Linux驱动开发人员必备的技能&#xff01; 1、了解设备树文件 在3.x版本以前的Linux内核源码中&#xff0c;存在大量的“arc/arm/mach-xxx”和“arc/arm/plat-xxx”文件夹&#xff0c;里面很多个“.c”和“.h”文件&#xff0c;它们用来描述设备信息。而现在的A…

深度学习与人类的智能交互:迈向自然与高效的人机新纪元

引言 随着科技的飞速发展&#xff0c;深度学习作为人工智能领域的一颗璀璨明珠&#xff0c;正日益展现出其在模拟人类认知和感知过程中的强大能力。本文旨在探讨深度学习如何日益逼近人类智能的边界&#xff0c;并通过模拟人类的感知系统&#xff0c;使机器能更深入地理解和解…

深空通信DTN总结

这里写自定义目录标题 A novel Federated Computation approach for Artificial Intelligence applications in Delay and Disruption Tolerant NetworksabstractintroductionDELAY AND DISRUPTION TOLERANT NETWORKS联邦计算用于容忍延迟和干扰的网络的联合学习框架DTN-ML Orc…

【视频图像取证篇】Impress模糊图像增强技术之颜色滤波器场景实例教程(蘇小沐)

【视频图像取证篇】Impress模糊图像增强技术之颜色滤波器场景实例教程&#xff08;蘇小沐&#xff09; Impress模糊图像增强技术之颜色滤波器场景实例教程—【蘇小沐】 1、实验环境 系统环境Impress&#xff0c;[v8.2.02]Windows 11 专业版&#xff0c;[23H2&#xff08;226…

犀牛7-软件基础设置

一、刚打开页面时&#xff0c;会弹出模板文件&#xff0c;一般我们选择小模型-毫米&#xff0c; 我们点击小模型-毫米之后&#xff0c;界面是这样的。 菜单栏&#xff1a;我们比较少使用&#xff0c;一般就用到创建文件。 命令栏(非常重要)&#xff1a;1、记录我们使用过的工…