c语言float数值精度
2011-08-07 23:21
225 查看
http://zh.wikipedia.org/wiki/IEEE_754
http://cprogramsjzu.blog.sohu.com/81276949.html
得到的a和b的值都是12345678848.000000
为什么本应该有7个有效数字,这里却是前8位都一样呢???
能保证7位准确,并不是说第8位就肯定不准确。
具体解释:
计算机保存浮点数时,是把数看作a*2^b这样的形式,不是以10为底数,而是以2为底数。即将数转换成以2为底的“科学计数法”的形式,再由这个形式反转换成10进制形式,但数据又有位数限制,所以有些数转换成二进制计数法形式后位数超出了限制的位数,那么转换回来时得到的数就会与原数有偏差,不同的数这个偏差是不同的,有可能在小数点后第7位,也有可能在第8位,也有可能在其他位数,但能保证小数点第6位之前是正确的。
Type Exponent length Mantissa length
float 8 bits 23 bits
浮点数的有效位:23Bits,合24位
其分辨率为:1/(2^24)=0.000,000,059,604644775390625
=0.000,000,06
即浮点数可表示的最小数的单位为0.000000059604644775390625;
其他的数都由0.000000059604644775390625 * 2^X来表示的,
12345678920
12345678900
000000059604644775390625
=12345678848
12345678848=0.000000059604644775390625 * 2^X
具体计算略
http://cprogramsjzu.blog.sohu.com/81276949.html
得到的a和b的值都是12345678848.000000
为什么本应该有7个有效数字,这里却是前8位都一样呢???
能保证7位准确,并不是说第8位就肯定不准确。
具体解释:
计算机保存浮点数时,是把数看作a*2^b这样的形式,不是以10为底数,而是以2为底数。即将数转换成以2为底的“科学计数法”的形式,再由这个形式反转换成10进制形式,但数据又有位数限制,所以有些数转换成二进制计数法形式后位数超出了限制的位数,那么转换回来时得到的数就会与原数有偏差,不同的数这个偏差是不同的,有可能在小数点后第7位,也有可能在第8位,也有可能在其他位数,但能保证小数点第6位之前是正确的。
Type Exponent length Mantissa length
float 8 bits 23 bits
浮点数的有效位:23Bits,合24位
其分辨率为:1/(2^24)=0.000,000,059,604644775390625
=0.000,000,06
即浮点数可表示的最小数的单位为0.000000059604644775390625;
其他的数都由0.000000059604644775390625 * 2^X来表示的,
12345678920
12345678900
000000059604644775390625
=12345678848
12345678848=0.000000059604644775390625 * 2^X
具体计算略
相关文章推荐
- C语言中关于float、double、long double精度及数值范围理解
- C语言中关于float、double、long double精度及数值范围理解
- C语言中关于float、double、long double精度及数值范围理解
- 解决java数值范围以及float与double精度丢失的问题
- float精度和数值范围
- double、float数值运算出现精度问题的解决方式
- c语言中float精度问题
- c语言题目,float精度问题
- C语言中单精度和双精度浮点型数据的数值范围
- C语言中float和double的精度
- java数值范围以及float与double精度丢失问题
- C语言中关于float、double、long double精度及数值范围理解
- float的数值范围与小数位精度
- 数值计算精度问题(double,float,Bigdecimal)
- java float 加减精度问题
- float或double相减精度丢失
- java float double为什么精度会丢失
- float与double的范围和精度
- C语言中数值类型转换 2014-09-16 13:17 414人阅读 评论(1) 收藏
- float与double的范围和精度