关于float丢失精度
在实际中遇到一个问题:
当float类型的一个数的整数部分特别大时,如4399670.00在计算时,这个数只保留两位小数,此时,这个数参加运算时,就会丢失小数级别的精度。0.15,0.25会被当做0.00。这是因为整数部分太长,float只占4个字节所造成的。此时,把计算相关的类型换成double即可。
代码:
float X = 0;
double Y = 0;
float Z = 0;
const float x_Dem = highResoluationDem.adfGeoTransform[0];
const double y_Dem = highResoluationDem.adfGeoTransform[3];
const float dx_Dem = highResoluationDem.adfGeoTransform[1];
const float dy_Dem = highResoluationDem.adfGeoTransform[5];
const int ncols_Dem = highResoluationDem.ncols;
for (int i = 0; i < row; i++)
for (int j = 0; j < col; j++) {
X = x_Dem + j * dx_Dem + 0.5f * dx_Dem;
/////////重点//////////////
Y = y_Dem + i * dy_Dem + 0.5f * dy_Dem;
Z = highResoluationDem.demdata[i * ncols_Dem + j];
if (Z != (float)_noneData) {
if (indexMap.demdata[i * ncols_Dem + j] == imageID)
{
float x = 0;
float y = 0;
//getxy(X, Y, Z, x, y, image);
float f = image.f;
const Rotation_Mat &m = image.m;
float Xs = image.Xs;
float Ys = image.Ys;
float Zs = image.Zs;
x = -f * (m.a1 * (X - Xs) + m.b1 * (Y - Ys) + m.c1 * (Z - Zs)) / (m.a3 * (X - Xs) + m.b3 * (Y - Ys) + m.c3 * (Z - Zs));
y = -f * (m.a2 * (X - Xs) + m.b2 * (Y - Ys) + m.c2 * (Z - Zs)) / (m.a3 * (X - Xs) + m.b3 * (Y - Ys) + m.c3 * (Z - Zs));
DT_8U value[3];
//image.get_PixelValueFormxy(x, y, value);
int _row = 0;
int _col = 0;
_row = -y + 0.5 * image.row;
_col = x + 0.5 * image.col;
float y_Dem = 4399670.00, double y_Dem = 4399670.00000000
只需将y_Dem和Y换成double即可,其他变量不需要变。
另外,在使用小数时,尽量使用浮点型,因为double占8字节,但默认情况下都是double型。
如:
//由于a有类型,所以后面的数无所谓
int a = 5;
float b = 0.5;
//但a是整型,0.5默认是double型,所以是0.5占了8个字节的空间。
float c = a*0.5;
//这样写最好
float c = a*0.5f;