DSP

浮点精度转换

2019-07-13 13:02发布

我们知道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,可以根据实际情况做修改。