浮動小数点精度変換

2668 ワード

http://blog.csdn.net/romandion/article/details/8182631
c/c++言語で浮動小数点は6桁の有効データであることを知っています.多くの統計アルゴリズムでは,大きな数値の計算が必要で,浮動小数点精度が不十分になる.浮動小数点をダブルに変換するのが一般的です.
しかし、問題に直面します.floatの精度以外の表示はdoubleに影響します.float f 32=0.00000 1のように、double f 64=f 32の場合、printf(“%.15f”、f 64);
「0.0000099999999999997」という値が印刷されます.大きな数をかけると結果に大きなばらつきがあります.
本論文では、浮動小数点を二重精度の場合に変換し、浮動小数点の精度に問題がないため、二重精度の計算に偏りが生じることがない.
[cpp]view play copy print?
ドビー float.64(float) f 32 , 要点 multi  
  • {  
  •     ドビー value = f 32 ;  
  •     value *= multi ;  
  •     int 64 i 64 = (int 64)value ;  
  •     ドビー left = value - i 64 ;  
  •     if((int)(left) * 10) >= 5)  
  •         i 64++ ;  
  •     value = (double)i 64  ;  
  •     return value /multi  
  • )  
  •   
  • ドビー float 2 double f 32)  
  • {  
  •     要点 i 32 = (int) f 32 ;  
  •     if(i 32 < 0)  
  •         i 32 = -i 32 ;  
  •   
  •     ドビー value = 0 ;  
  •     int 64 i 64 = 0 ;  
  •   
  •     if(i 32 < 10)  
  •         return float at 64(f 32) , 100000) ;  
  •     else if(i 32 < 100)  
  •         return float at 64(f 32) , 100000) ;  
  •     else if(i 32 < 1000)  
  •         return float at 64(f 32) , 10000) ;  
  •     else if(i 32 < 10000)  
  •         return float at 64(f 32) , 1000) ;  
  •     else if(i 32 < 100000)  
  •         return float at 64(f 32) , 100) ;  
  •     else if(i 32 < 100000)  
  •         return float at 64(f 32) , 10) ;  
  •     else  
  •         return float at 64(f 32) , 1) ;  
  • }  
  • 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) ;
    }
    コードの中のint 64は64ビットの符号整型である.linux下int 64_t,windows下は_uですint 64は、実際の状況に応じて修正することができる.