float占4个字节,使用科学计数法表示,形式为 1.abcdefg × 10n,1是固定值,故省略掉, 第31个字节表示正负,第30~23位共8个字节是指数位,第22~0位共23个字节是小数位。
8个字节指数位范围与byte字节的整数范围一样,-128~128
23个字节的小数位的范围是:223 = 8388608,这是一个7位数字,加上省去的1,因此float最大有8位有效数字,保证有7位有效数字。
由于float的指数部分对应的指数范围为-128~128,所以取值范围为:
-2^128到2^128,约等于-3.4E38 — +3.4E38
1 float a = 138870.826789; 2 double b = 138870.826789; 3 cout.setf(ios::fixed); 4 cout.precision(6); 5 cout << "float " << a << endl; 6 cout.precision(6); 7 cout << "double " << b << endl;
如上代码所示,不论怎么改变小数点第三位及以后的值,float类型都不能正确输出小数点第三位:
可以正确表示前8位,有8位有效数字。
当float的第1位数字大于2时,
1 // 338860 8 2 float a = 338870.826789; 3 double b = 338870.826789; 4 cout.setf(ios::fixed); 5 cout.precision(6); 6 cout << "float " << a << endl; 7 cout.precision(6); 8 cout << "double " << b << endl;
结果为:
小数点后的第二位以后就不能正确表示了,有效数字只有7位。
对于地理坐标而言:
如上数据,高斯克吕格3°带投影,x、y坐标第一位数字基本都会大于1,因此对于投影坐标而言,有效数字只有7位。
所以,在将地理投影数据存储为las格式时,las是以float类型存储数据的,float为7位有效数字,当要保证mm级精度时,
las的偏移量的适用范围为10km,超出这个范围要重新指定偏移量,否则就会有精度损失了。