【C语言】数据的存储_数据类型:浮点型存储

常见的浮点数:

3.1415926

1E10 

浮点型包括:float、double、long double类型

浮点数表示的范围:float.h中定义

 浮点数存储规则:

第二个n和*pFloat在内存中明明是同一个数,但浮点数和整数解读结果差别很大。

要理解这个结果,一定要搞懂浮点数在计算机内部的表示方法。

详细解读:

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

(-1)^S*M*2^E

(-1)^S表示符号位,当S=0,V为正数,当S=1,V为负数

M表示有效数字,大于等于1,小于2.

2^E表示指数位

举个栗子:

比如V=5.0,我们先把它转化成二进制即101.0,然后再写成科学计数法的形式即1.01*2^2(第一个2表示是二进制,第二个2表示移两位)所以可以写成(-1)^0*1.01*2^2。

再如V=9.5,我们把它转化为二进制位1001.1(因为最后一个1的权重表示2^-1,即0.5),转化为科学计数法的形式:1.0011*2^3,即(-1)^0*1.0011*2^3。(S=0,M=1.0011,E=3)

又如V=9.6,我们会发现这个数无法转化成二进制,假如说是1001.11,我们会发现小数点后表示0.75,我们发现总是会差一点,从而精度丢失,所以也就是说小数再内存中可能是无法精确保存的,但double类型的精度显然要比float高。

IEEE 754规定:

对于32位的浮点数,最高位的1位是符号位S,接着的8位是指数E,剩下的23位为有效数字M。

而对于64位的浮点数,最高位的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M。

IEEE 754对有效数字M和指数E有一些特殊的规定:

有效数字M的值是大于等于1,小于2的,所以M可以写成1.xxxxxxxx的形式,其中xxxxxxxx表示小数部分。

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

相对指数E就比较复杂,首先E是一个无符号整数(unsigned int)这意味着,如果E为8位,它的取值范围为0~255;如果E为11位,它的取值范围为0~2047,但是我们知道,科学计数法中的E是可以出现负数的,所以IEE 754规定,存入内存E的真实值必须在加上一个中间数,对于8位的E,这个中间数是127;对于11位的E这个中间数是1023.比如,2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001.

#include<stdio.h>
int main()
{float f = 5.5;//(-1)^0*1.011*2^2//S=0  M=1.011  E=2//0  2+127=129(真实的E加上中间值)即10000001  01100000000000000000000(M)//因此存放的二进制序列为01000000101100000000000000000000//写成十六进制即0x40 b0 00 00(小端存放)return 0;
}

 

然而,指数E在内存中取出还可以分成三种情况:

E不全为0,或不全为1

这时浮点数就采用下面的规则表示,即指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第一位的1.

比如:

0.5的二进制形式为0.1,由于规定整数部分必须为1,即小数点向右移一位,则为1.0*2^(-1),其阶码为-1+127=126,表示为

0 01111110 00000000000000000000000

 E全为0

这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,

有效数字M不再加上第一位的1,而还原为0.xxxxxxx的小数。这样做是为了表示+0,以及接近0的很小的数字

E为全1

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

 这些就是关于浮点数的表示规则

举个浮点数存储的例子栗子:

#include<stdio.h>
int main()
{int n = 9;float* pFloat = (float*)&n;printf("n的值为:%d\n", n);printf("*pFloat的值为:%f\n", *pFloat);*pFloat = 9.0;printf("n的值为:%d\n", n);printf("*pFloat的值为:%f\n", *pFloat);return 0;
}

先看第一部分9的二进制序列为:

00000000000000000000000000001001,我们站在整型的角度去看它,打印出来就是9

而当我们站在浮点型角度

0 00000000 00000000000000000001001

第一个0是符号位表示正数,而E全为0,真实值为-126,表示的数字为(-1)^0*0.00000000000000000001001*2^(-126),是一个无穷小数字

再来看第二部分9.0转化为二进制为:

1001.0=(-1)^0*1.001*2^3

E=3,则存入内存E的真实值为130所以二进制序列为:

0 10000010 00100000000000000000000

站在整型角度0表示正数,所原码、补码、反码相同,这个32的二进制序列转化为十进制,正是1091567616.

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【热门话题】常用经典目标检测算法概述

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 常用经典目标检测算法概述1. 滑动窗口与特征提取2. Region-based方法R-CNN系列M…

SOTAX溶出测试系统PC触摸屏维修三部曲

SOTAX溶出测试系统作为一款广泛应用于制药行业的知名品牌&#xff0c;具有高精度、操作简便、稳定性好等特点。它适用于各种类型的药品研发和生产环节&#xff0c;为科研人员提供可靠的数据支持。瑞士SOTAX溶出仪是实验室中常用的设备&#xff0c;其触摸屏是用户交互的重要界面…

apache和IIS区别?内网本地服务器项目怎么让外网访问?

Apache和IIS是比较常用的搭建服务器的中间件&#xff0c;它们之间还是有一些区别差异的&#xff0c;下面就详细说说 Apache和IIS有哪些区别&#xff0c;以及如何利用快解析实现内网主机应用让外网访问。 首先说说apache和IIS最基本的区别。Apache运行的操作系统通常为Unix或Lin…

05_Qt资源文件添加

Qt资源文件添加 Qt 资源系统是一个跨平台的资源机制&#xff0c;用于将程序运行时所需要的资源以二进制的形式存储于可执行文件内部。如果你的程序需要加载特定的资源&#xff08;图标、文本翻译等&#xff09;&#xff0c;那么&#xff0c;将其放置在资源文件中&#xff0c;就…

RuoYi-Vue-Plus (SaToken 注解鉴权)

一、SaInterceptor 注解鉴权和路由拦截鉴权 拦截器&#xff1a;SaInterceptor 实现类位置&#xff1a; cn.dev33.satoken.interceptor.SaInterceptor 功能&#xff1a;Sa-Token 综合拦截器&#xff0c;提供注解鉴权和路由拦截鉴权能力 /*** 创建一个 Sa-Token 综合拦截器&…

c++ 二分查找

二分查找&#xff08;Binary Search&#xff09;是一种在有序数组中查找特定元素的高效算法。它通过不断将搜索范围减半来查找目标元素。其时间复杂度为 O(log n)&#xff0c;这是因为每一步都将搜索范围减半&#xff0c;因此算法的性能非常高。 二分查找的基本思想是&#xf…

用户中心 -- 插件使用 插件使用思路

易错注意点 1 5.1启动类 & 入口类 需保持一致 网址&#xff1a; 第一节课&#xff0c;用户管理--后端初始化&#xff0c;项目调通。二次翻工2-CSDN博客 一、 用户管理 框架 网址&#xff1a; 用户管理 --汇总 -- 明细-CSDN博客 1.2 更改路径&#xff0c;并生效 网址…

vue3中所有页面需要手动刷新一下才能显示,控制台没有报错

1.问题 登录进来是进入首页&#xff0c;然后切换任何页面都是空白&#xff0c;但是控制台没有报错。在其他页面刷新后却能显示&#xff0c;然而切换到首页刷新后再切换到其他页面又是空白。 2.解决问题 原因&#xff1a;在于首页给了两个根标签&#xff0c;我把其中一个根标签…

TypeScript学习8:泛型

函数泛型 引入需求 如果我们不使用泛型 我们会这样子去实现&#xff1a; function numberArray(a1:number, a2:number):number[]{return [a1, a2] } function stringArray(a1:string, a2:string):string[]{return [a1, a2] }但是如果我还需要别的类型参数呢&#xff0c;比如…

定制自己的 AI 角色CustomChar;AI知识点和面试题;提高llama 3 的微调速度Unsloth

✨ 1: CustomChar 允许你创建和定制自己的 AI 角色 CustomChar 是一个开源项目&#xff0c;它允许你创建和定制自己的 AI 角色。无论是游戏中的角色&#xff0c;还是个人的虚拟助手&#xff08;比如电脑上的 JARVIS&#xff09;&#xff0c;甚至是在线教育体验中的虚拟朋友或…

vite和webpacke的常规配置

文章目录 1、vite和webpacke的区分2、vite的常规配置介绍主要部分介绍vite基本配置示例 3、webpacke的常规配置介绍主要部分介绍Webpack 基本配置示例 1、vite和webpacke的区分 相同点&#xff1a; 都是构建工具&#xff0c;用于资源打包 &#xff1b; 都有应用到摇树原理 tre…

Rust Tracing 入门

Tracing 是一个强大的工具&#xff0c;开发人员可以使用它来了解代码的行为、识别性能瓶颈和调试问题。 Rust 是一种以其性能和安全保证而闻名的语言&#xff0c;在它的世界中&#xff0c;跟踪在确保应用程序平稳高效运行方面发挥着至关重要的作用。 在本文中探讨Tracing 的概…