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

浮点数非精确存储

发布时间: 2022-11-17 13:02:18

‘壹’ 请问浮点型数据在计算机是怎么存储

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

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

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

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

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

(1)浮点数非精确存储扩展阅读

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

其类型说明符为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型处理。

‘贰’ C语言中浮点数为什么不能准确存储

浮点数,即双精度double型或单精度float型,拿双精度的double来说,定义一个double型的变量,如
double
a;那么a在内存中开辟了一个32位的空间来存储变量a,但是你要存储变量a,计算机要将浮点数a用一个定点整数和一个定点小数表述,在对阶码的时候,由于各个计算机CPU的字长不一样,可能造成对阶时产生小数部分丢失,这样造成了存储不准确。建议看看组成原理。

‘叁’ 浮点数在计算机中的存储方式

应该是: 在一个为32bit的存储空间中存储浮点数,bit0~bit22存储有效数字部分;bit23~bit30存储指数部分;bit31存储符号位。 在一个为64bit的存储空间中存储浮点数,bit0~bit51存储有效数字部分;bit52~bit62存储指数部分;bit63存储符号位。 还一种 在一个为80bit的存储空间中存储浮点数,bit0~bit62存储有效数字部分;bit63~bit78存储指数部分;bit79存储符号位。 只有这三种了,其他都不支持的 未来可能还有128位浮点数

‘肆’ 为什么说有的浮点数无法精确的表示

因为二进制只能表示2的n次方的数,n可以取负值,3.3无法用2的n次方的数组合计算出来,所以无法精确表示:3.3=1*2+1*1+0*1/2+1*1/4+0*1/8+0*1/16+1*1/32+...
其中分式的分母只能是2的倍数(二进制所限),3.3的二进制表示是11.01001.....
有些数比如1/3就无法精确计算,只能无限逼近

‘伍’ java 浮点数为什么精度会丢失

并不是java的浮点数精度会丢失,而是所有用二进制存储中的浮点数都可能会精度丢失(部分特殊的小数数值可以精确表示),所以计算机中存储的浮点数都存在精度丢失的风险,不过一边这个丢失的精度对我们正常的使用不会构成影响。

小数在转换为二进制时并不一定能用一个精确的二进制表示,大多数时候都是取的一个近似值,这就造成了精度的丢失。如果再用这个二进制进行计算,明显计算结果的精度会进一步丢失。

举个简单的例子把0.1用二进制表示(小数与二进制转换方法)

(1)0.1x2=0.2取整数位0得0.0
(2)0.2x2=0.4取整数位0得0.00
(3)0.4x2=0.8取整数位0得0.000
(4)0.8x2=1.6取整数位1得0.0001
(5)0.6x2=0.2取整数位1得0.00011
(6)0.2x2=0.4取整数位0得0.000110
(7)0.4x2=0.8取整数位0得0.0001100
(8)0.8x2=1.6取整数位1得0.00011001
(9)0.6x2=1.2取整数位1得0.000110011
(n)...

得到一个无限循环的二进制小数 0.000110011…,没办法用一个精确的二进制表示0.1。而且计算机中存储一个浮点数所用的位数也是有限的,所以只能选择在某一个精度进行保存。

当然也有特殊的小数,比如0.25的二进制为0.01

附:代码之谜(五)- 浮点数(谁偷了你的精度?)

‘陆’ 为什么说浮点数缺乏精确性

浮点运算的精确度应该与你的需求有关
使用浮点数进行比较,你应该设置一个目标精确度:比如小数点后3位,也就是精确度是:0.001,那么你在比较两个数时比较它们查的绝对值小于0.001就可以了
浮点数本来就是不精确的

‘柒’ 浮点数的解释

浮点数是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数。具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学记数法。
浮点计算是指浮点数参与的运算,这种运算通常伴随着因为无法精确表示而进行的近似或舍入。
一个浮点数a由两个数m和e来表示:a = m × b^e。在任意一个这样的系统中,我们选择一个基数b(记数系统的基)和精度p(即使用多少位来存储)。m(即尾数)是形如±d.ddd...ddd的p位数(每一位是一个介于0到b-1之间的整数,包括0和b-1)。如果m的第一位是非0整数,m称作规格化的。有一些描述使用一个单独的符号位(s 代表+或者-)来表示正负,这样m必须是正的。e是指数。
这种设计可以在某个固定长度的存储空间内表示定点数无法表示的更大范围的数。
例如,一个指数范围为±4的4位十进制浮点数可以用来表示43210,4.321或0.0004321,但是没有足够的精度来表示432.123和43212.3(必须近似为432.1和43210)。当然,实际使用的位数通常远大于4。
此外,浮点数表示法通常还包括一些特别的数值:+∞和�6�1∞(正负无穷大)以及NaN('Not a Number')。无穷大用于数太大而无法表示的时候,NaN则指示非法操作或者无法定义的结果。
众所周知,计算机中的所有数据都是以二进制表示的,浮点数也不例外。然而浮点数的二进制表示法却不像定点数那么简单了。
先澄清一个概念,浮点数并不一定等于小数,定点数也并不一定就是整数。所谓浮点数就是小数点在逻辑上是不固定的,而定点数只能表示小数点固定的数值,具用浮点数或定点数表示某哪一种数要看用户赋予了这个数的意义是什么。

阶符是当一个数用科学计数法表示时,它的指数的符号,指数是正还是负,正负号就是阶符。 计算机机内数,当用科学计数法表示时,分尾数,指数,阶符3部分,阶符占1位,负为1,正为0。
C语言用e格式写数时
3.456e-03
就是 3.456 乘 10的负3次方,
e后面的-号,就是阶符
正阶符,不写东西,或写+号。
3.456e03 就是 3.456 乘 10的正3次方,

浮点数的阶码可用补码或增码(移码)表示,数的表示范围是,在浮点表示方法中是隐含的

尾数是定点整数来的,尾数符号叫尾符

‘捌’ 浮点型数据在内存中实际的存放形式(储存形式)

浮点型数据在内存中存储不是按补码形式,是按阶码的方式存储,所以虽然int和float都是占用了4个字节,如果开始存的是int型数据,比如是个25,那么用浮点的方式输出就不是25.0,也许就变的面目全非。
你可以用共用体的方式验证一下。在公用体中定义一个整形成员变量和一个浮点型成员变量,给整形赋值25,输出浮点成员变量,你就知道了。

‘玖’ mysql的浮点型在什么情况下会损失精度,求大神详解、、

谈谈个人理解,请带着怀疑和鉴别的角度去看待。
1 先理解下定点数
--定义:
指规定小数点位置固定不变。
--存储:
* 在数据库或计算机中存储时,整数部分和小数部分分别使用一定的字节来存储(理解为分别用两部分字节来存储两个整数),小数点是作为存储属性存储的(如作为列类型时,小数点位置存储在表的定义部分),而不占用数据的存储字节。
* 定点数使用多少字节来存放数据,依赖于该数指定的精度(精度即为该数的总数字位数),总数字位数为小于2则使用1字节,为5-9位时用4字节,为19-38位时使用16字节(大部分数据库支持的最大就是38位数字);
--举例:
numeric(2,1),精度为2,使用1个字节来存放,存放数据范围为[-9.9, 9.9];如存储2.3时,在数据库存储为00100011,而小数位置固定在第四位前,这是由定义列时指明的;
--说明:
定点数存储精确的数字,numeric(2,1)就只能[-9.9, 9.9]之间的数,存的不是近似数(因为两部分都作为整数存储);当你在numeric(2,1)中存储2.33时,实际发生了隐式转换,实际存储为9.3(注意这并不是近似);

2 再来理解浮点数
--定义:
指采用浮点数表达方式来表示数据,这种表达方式利用科学计数法来表达实数,即用一个尾数(Mantissa ),一个基数(Base),一个指数(Exponent)以及一个表示正负的符号来表达数据,比如 123.45 用十进制科学计数法可以表达为 1.2345 × 10^2,其中 1.2345 为尾数,10 为基数,2 为指数。称其为浮点数就是因为利用指数达到了浮动小数点的效果。
--存储:
浮点数一般是使用IEEE规定的方式,即 对于单精度浮点数用1bit来存储符号位(正负号),8bit来存储指数,23bit来存储尾数;而且要求尾数的整数部分为1(注意,指二进位格式的,如1.01001),而且是使用二进位来保存,即基数为2;
在大多数数据库或计算机中存储时,单精度使用4字节,双精度使用8字节保存;
--举例:
二进制的 1001.101(对应于十进制的 9.625)可以表达为 1.001101 × 2^3,存储时符号位+存储为0,指数3存储为00000011,尾数1.001101存储为0011010000..(总共23位,去掉了小数点前的1,IEEE就是这样要求的);
--近似的产生:
因为我们使用的是十进制数,而计算机要转换为对应的二进制形式,由于有限的2进制位数表示的小数值不能和十进制一一对应(换句话说,十进制小数转为二进制可能变为无限小数而导致不精确 ),如2^-1对应0.5,2^-2对应0.25,2^-3对应0.125,因此对于像十进制的0.4(小数的末尾一位数不为5的)则不能精确存储;
--因近似引起的问题:
create table t (a float, b float); insert into t values(0.11, 0.04), (0.04, 0.11);
select * from t; 查询时显示正常,实际底层存储时发生了近似(十进制转换为二进制),而显示时又发生了近似(二进制转换为十进制);
select sum(a) from t; 查询显示 0.14999999850988388 ,为什么不是0.15的原因也就不言而喻了。
这也就是浮点数在损失精度、计算和比较要格外注意的事项;

3 总结
定点数,能存储精确数字,但保存的数据范围受了严格限制,格式也比较僵硬(这既是好处,也是坏处);
浮点数,不能存储精确数字,在小数的末尾一位数不是5(一直乘2不能圆整)的情况下会发生存储的近似处理;但可存储的数据范围更大;

‘拾’ 什么是浮点数啊

浮点数是表示小数的一种方法。所谓浮点就是小数点的位置不固定,与此相反有定点数,即小数点的位置固定浮点数的实现在各种平台上差异很大,有的处理器有浮点运算单元(FPU,FloatingPointUnit),称为硬浮点(Hardfloat)实现。

整数可以看做是一种特殊的定点数,即小数点在末尾。8086/8088中没有浮点数处理指令,不过从486起,CPU内置了浮点数处理器,可以执行浮点运算。

一般的浮点数有点象科学计数法,包括符号位、指数部分和尾数部分。 有的处理器没有浮点运算单元,只能做整数运算,需要用整数运算来模拟浮点运算,称为软浮点(Softfloat)实现。

扩展推荐:

编程学习过程中可以看得书推荐。《代码大全(第二版)》出自着名IT畅销书作者史蒂夫·迈克康奈尔之手,曾被《软件开发》杂志授予优异产品震撼大奖。

《每个程序员都应该知道的97件事情》( 97 things every programmer should know )对于编程初学者来说这本书都可以算上一个优质的入门书籍。本书提供了丰富的编程实践及理念,提供了大量的实例,并且书的排版格式阅读起来十分简洁方便

《计算机程序设计艺术 (第一卷)》由着名的计算机科学家教授Donald Knuth编着,并得到行业内众多顶尖程序员的一致好评。甚至连比尔盖茨也对这本书赞誉有加。