存储精度
‘壹’ matlab中的存储精度。
默认为64位浮点,double
其他数据类型还有:
logical -- Logical array
char -- Character array
single -- Single precision floating-point numeric array
float -- Double or single precision floating-point numeric array
int8 -- 8-bit signed integer array
int16 -- 16-bit signed integer array
int32 -- 32-bit signed integer array
uint32 -- 32-bit unsigned integer array
int64 -- 64-bit signed integer array
integer -- An array of any of the 8 integer classes above
numeric -- Integer or floating-point array
cell -- Cell array
struct -- Structure array
‘贰’ 为什么用%g存储的小数有变化
这涉及到两个方面的问题:
①电脑对浮点数(float)的表述。32位对浮点数的表达是:0~22位=尾数;23~30是指数,31位则是符合位。说白了就是十进制的小数部分是按照1/2+1/4+1/8+....这样的方式去逼近的,因此存在误差,也就是所谓的{存储精度}的问题。上面的121.6234其实电脑中的16进制数是:0x42f33f2e,再转换回10进制≈121.62339782714844,不同的编译器在不同的机器上,还有些许的误差。因此虽然文件中是121.6234,但读取到电脑内存中时按二进制或16进制存储,在printf时,按格式又转换,因此二者之间存在转换误差。
②%f和%g的区别。不带控制长度的%f,只表示6位精度(即小数点后面),因此%f≈121.623398,而%g则是{最多}6位(有效位含小数点前后),因此%g≈121.623。
而%.9g则表示最多有效位9位,这个处理是在0x42f33f2e(121.62339782714844)这个数基础上作的取舍,≈121.623398(...78四舍五入)。
也正是这个原因,高精度浮点运算有专门的库。
③ 可以用double替代float提高精度。因为在电脑中,double是64位,尾数部分有52位表示,11位指数位和1个符号位构成。121.6234 = 1.216233978271484375E2 = 0x405E67E5C91D14E4,因此更逼近121.6234. 演示代码如下:
#include<stdio.h>
intmain(intargc,charconst*argv[])
{
floata=121.6234;
doubled=121.6234;
printf("%.9g%f ",a,a);
printf("%.9g%f ",d,d);
return0;
}
运行:
121.623398121.623398
121.6234121.623400
数据类型的长度是存储数据所占用的字节数,指的是物理存储空间大小。
精度是指最多可以存储的十进制数字的总位数,包括小数点左边和右边的位数。
‘肆’ C语言中单精度数据的存储范围,求高手指点啊
单精度存储首先最高位是符号位。
然后有8位的指数位。代表
2^-127
~
2^128
(存储时
127代表
2^0
255代表2^128
0为
2^-127)
后面的23位是尾数即小数位。没有整数,在存储时会移好位,使的整数为1,如2
会存成
1*2^1
这样,1.9999*2^128
大约为
6.8*10^38
双精度的指数部分为11位,2^-1023~2^1024
最大能存大约
3.595*10^308