浮動小数点精度変換
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) ; }
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
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は、実際の状況に応じて修正することができる.