当前位置:首页 » 服务存储 » 浮点数存储
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

浮点数存储

发布时间: 2022-01-14 01:19:05

A. 浮点数的存储问题

先看看浮点数格式
·一个浮点数总共有4个字节,32位
第一个比特表符号 0正数 1负数
后八个比特表阶码,即为指数,这个数在实际的数上面加127
最后23个比特表尾数 原码表示

具体分析
对于3.25

正数 首位为0

用二进制表示 11.01=1.101乘以2的1次方
所以阶码为1 127+1=128
10000000

对于尾数1.101,因为规格化的数都是最高位为1,即小数点左边的数为1
所以这个1就省略,因此存储的时候就存101

10100000 00000000 0000000

把所有的拼起来
01000000 01010000 00000000 00000000

你的上面最后写反了

B. 计算机浮点数的储存原理

浮点是以单元形式储存在内存上的,但每个单元内存有限,所以比如你想输入1/3的话,你以为是1/3了,实际上不足1/3,而是0.3333333333333333,所以计算时,会以0.3333333333333333的形式去计算,而不是1/3,因此出现了本来是0.6的,而输出却是0.599976.建议把浮点精度变大

C. 浮点型参数怎么存到存储器里

一般我更喜欢用共用体:

//声明共用体
union _UnFloat
{
unsigned char byData[4];
float fData;
}unFloat;

//保存到存储器:
float Data = 123.456789;//浮点数
unFloat.fData = Data;//浮点数赋值给共用体
//然后unFloat.byData[0]、unFloat.byData[1]、unFloat.byData[2]、unFloat.byData[3]就分别是浮点数4个字节的内容了,把这四个字节写入存储器就可以了。

//从存储器中读出浮点数据
unFloat.byData[0] = 读存储器中浮点数保存的第一个字节;
unFloat.byData[1] = 读存储器中浮点数保存的第二个字节;
unFloat.byData[2] = 读存储器中浮点数保存的第三个字节;
unFloat.byData[3] = 读存储器中浮点数保存的第四个字节;

float Data = unFloat.fData;//这个就是存储器中保存的浮点数了

实际应用中一般保存到存储器或者RS232、RS485传输等,我都使用这种方式,比较方便。

D. c语言中浮点型数据的存储方式

所谓浮点数, 其实就是二进制的科学计数法. 十进制的科学计数法为 a.b * 10^n (这里 "^" 表示幂). 其中a 大于或等于1而小于10. 只有0不能用这个形式表示.

二进制的科学计数法为 1.x *10^N, 整数部分恒为1, 所以只要存贮X与N就可以.一般都是用一个位存贮符号, 再用几个二进制位存贮X, 另几个二进制位存贮N. 原则就是这样了, 但具体的格式又有所区别. 比如按IEEE来说, 有单精度, 双精度等; 还有一些软件自己定义的格式, 空间哪些位存贮X, 哪些位存贮N, 0怎么办, NaN怎么表示, 等等都要自己规定.

E. 请问浮点型数据在计算机是怎么存储的

对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit。

无论是单精度还是双精度在存储中都分为三个部分:

1、符号位(Sign) : 0代表正,1代表为负。

2、指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储。

3、尾数部分(Mantissa):尾数部分。

(5)浮点数存储扩展阅读

实型变量分为两类:单精度型和双精度型,

其类型说明符为float 单精度说明符,double
双精度说明符。在Turbo
C中单精度型占4个字节(32位)内存空间,其数值范围为3.4E-38~3.4E+38,只能提供七位有效数字。

双精度型占8
个字节(64位)内存空间,其数值范围为1.7E-308~1.7E+308,可提供16位有效数字。

实型变量说明的格式和书写规则与整型相同。

例如: float x,y; (x,y为单精度实型量)

double a,b,c; (a,b,c为双精度实型量)

实型常数不分单、双精度,都按双精度double型处理。

F. 单片机内浮点数怎么存储

单片机一般只用定点,即使dsp也只是部分浮点,绝大多数还是定点。
要用一般遵循IEEE 754的浮点数存储格式

第二个问题问的有点不知所云,外扩总线总是并行总线,其他的属于通信方式,不属于系统总线,我只能这么理解你的问题。

G. 计算机是如何存储浮点数的(工作原理,实现方式)

计算机用二进制来表示数字,浮点数也是如此:
首先了解如何用二进制表示小数(也就是如何把十进制小数转化为二进制表示):
举一个简单例子,十进制小数 10.625
1)首先转换整数部分:10 = 1010b
2)小数部分0.625 = 0.101b
(用“乘2取整法”:0.625*2=1.25,得第一位为1,0.25*2=0.5,得第二位为0,0.5*2=1, 得第三位为1,余下小数部分为零,就可以结束了)
3)于是得到 10.625=1010.101b
换个表示方式更加深入理解:
1*(10^1)+0*(10^0)+6*(10^-1)+2*(10^-2)+5*(10^-3) =
1*(2^3) + 0*(2^2) + 1*(2^1) + 0*(2^0) + 1*(2^-1) + 0*(2^-2) + 1*(2^-3)
4) 类似十进制可以用指数形式表示:
10.625=10625*(10^-3)
所得的二进制小数也可以这样指数形式表述:
1010.101b=1010101 * (2^-3)
也就是用有效数字a和指数e来表述: a * (2^e)
用一个32bit的空间(bit0~bit31)来存储这么一个浮点数,如此分配存储空间:
bit0 ~ bit22 共23bit,用来表示有效数字部分,也就是a,本例中a=1010101
bit23 - bit30 共8个bit,用来表是指数,也就是e,范围从-128到127,实际数据中的指数是原始指数加上127得到的,如果超过了127,则从-128开始计,所以这里e=-3表示为124
bit31 为符号位,1表示负数,这里应该为0
把上述结果填入32bit的存储器,就是计算机表示小数10.625的形式。

注意这个例子的特殊性:它的小数部分正好可以用有限长度的2进制小数表示,因此,而且整个有效数字部分a的总长度小于23,因此它精确的表示了10.625,但是有的情况下,有效数字部分的长度可能超过23,甚至是无限多的,那时候就只好把后面的位数截掉了,那样表示的结果就只是一个近似值而非精确值;显然,存储长度越长,精度就越高,比如双精度浮点数长度为64位,1位符号位,11位指数位,52位有效数字。

H. C语言浮点数的储存方式为何浮点数储存不准确那个图片是什么意思

C语言中,无论是单精度还是双精度在存储中都分为三个部分:
1. 符号位(Sign) : 0代表正,1代表为负
2. 指数位(Exponent)(注:也叫阶码):用于存储科学计数法中的指数数据,并且采用移位存储(注:移码编码表示)
3. 尾数部分(Mantissa):尾数部分
关于不精确是由于十进制小数部分化二进制,常常化不尽。如同无限循环小数,最后有截断误差。
图片中的是float型的变量的存储上的格式。

I. 浮点数 在计算机内的存储形式

浮点数不难,但是要想记熟还真有点不容易,多琢磨琢磨。

一般情况下,浮点数的表示有一下几个要点:

1、要规格化(让浮点数表示结果唯一),因为100=10^2 = 0.1 * 10^3, 所以第一步要统一地规格化,确定“阶数”和“尾数”(尾数在0.5-1之间,也就是二进制的0.1-1.0之间)

2、“阶码”一般用“移码”表示法,而“尾数”一般用“原码/补码表示法,“数符”表示浮点数的正副号

3、浮点数的形式: “符号位”【应该就是‘数符’】+“阶码”+“尾数“
--浮点数的表示按照不同地标准,表示方法不同,你的原问题没讲清楚用什么格式表示,我就用最常用地格式来理解了
------------------
其实就以上两点,计算机中“‘帯符号数’的表示”有四种:原码、补码、反码、移码,这些都是基础知识,可以自己去看一下这四种表示方法,就自然明白“阶符、数符”这些相当于“符号位”的作用了。

先简单讲一下吧,你再结合详细资料看吧:【设所表示的都是定点纯小数】
(小数点前面可以看成是“符号位”,也就对应原来地“阶符”和“数符”)
原码:0.11表示0.75(2^-1 + 2 ^-2), 1.11表示 ‘-0.75’(前面的1相当于符号位,表示这个数是负数,也就是说“符号位是0”表示正数,1表示负数)

补码:最普遍地就是补码了 0.11表示0.75, 1.11表示‘-0.25’(也是“0”为正数,1为负数。和原码地规律一样)

反码,最简单了:正数不变,负数对每一位‘取反’即可,0.11=0.75,1.10=-0.25(即0.01地相反数)
-------------以上三种表示方法,对正数的情况都不做处理,但是移码表示法要对正数做处理。

移码:1.01=0.25,而0.01=-0.75
。移码复杂一点,他的表示方法是: 移码= 2^阶码位数 + 真值(真值:指原来那个‘帯符号数’,注意要把把正副号带入计算)

-----------------------------------
N=-0.110101x2^100: 阶数是“正100”,尾数是“负0.110101”,所以整个浮点数是个负数,所以第一位是“1”【第一个符号位-“数符”表示‘尾数的正负号’】
阶码是“10 0100”【移码表示法,最高位是“符号位”】

所以,应该表示为: 1(符号位) 100100(阶码的移码表示) 11010100【尾数和符号位结合起来,用的是原码表示法】

J. 单片机的浮点数存储

float t=523.5;
char *p = (char*)&t;
就像这样读取第一字节,char *p = (char*)&t+1;
读取第二字节,以此类推然后一字节一字节的读出数据保存在24里面,最后按顺序读回去