浮点精度转换

我们知道c/c++语言中,浮点是6位有效数据。在很多统计算法中,需要做大数值的计算,导致浮点精度不足。一般做法是将浮点数转换成double。

但会面临一个问题,float的精度之外的表示会影响到double。比如 float f32 = 0.000001 ,如果 double f64 = f32 ,那么printf("%.15f \n" , 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,可以根据实际情况做修改。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值