我们知道c/c++语言中,浮点是6位有效数据。在很多统计算法中,需要做大数值的计算,导致浮点精度不足。一般做法是将浮点数转换成double。
但会面临一个问题,float的精度之外的表示会影响到double。比如 float f32 = 0.000001 ,如果 double f64 = f32 ,那么printf("%.15f
" , f64) ;
就会打印出"0.000000999999997"这样的值。如果拿来计算,比如乘以大数,就会导致结果有比较大的偏差。
本文主要解决,将浮点数转换成双精度情况,不会因为浮点数的精度问题,引起双精度的计算出现偏差。
double float_64(float f32 , int multi)
{
double value = f32 ;
value *= multi ;
int64 i64 = (int64)value ;
double left = value - i64 ;
if((int)(left * 10) >= 5)
i64++ ;
value = (double)i64 ;
return value /multi;
}
double float2double(float f32)
{
int i32 = (int) f32 ;
if(i32 < 0)
i32 = -i32 ;
double value = 0 ;
int64 i64 = 0 ;
if(i32 < 10)
return float_64(f32 , 1000000) ;
else if(i32 < 100)
return float_64(f32 , 100000) ;
else if(i32 < 1000)
return float_64(f32 , 10000) ;
else if(i32 < 10000)
return float_64(f32 , 1000) ;
else if(i32 < 100000)
return float_64(f32 , 100) ;
else if(i32 < 1000000)
return float_64(f32 , 10) ;
else
return float_64(f32 , 1) ;
}
代码中int64是64位有符号整型。linux下int64_t,windows下是__int64,可以根据实际情况做修改。