float有效数字分析,附:las数据偏移量设置

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,超出这个范围要重新指定偏移量,否则就会有精度损失了。

原文地址:https://www.cnblogs.com/xingzhensun/p/6281991.html