私はCでdoubleをfloatに変換したいのですが、変更せずに小数点をできるだけ正確に保持したい...
たとえば、私が持っているとしましょう
double d = 0.1108;
double dd = 639728.170000;
double ddd = 345.2345678
今私が間違っている場合、私を修正し、浮動小数点の精度はドットの後の約5つの数字であることを知っています。ダブルが持っていたようにドットの後にこれらの5つの数字を取得できますか?上記の結果は次のようになります。
float f = x(d);
float ff = x(dd);
float fff = x(ddd);
printf("%f\n%f\n%f\n", f, ff, fff);
印刷するはずです
0.1108
639728.17000
345.23456
精度制限(これは5と想定)の後のすべての数字は切り捨てられます。
float
およびdouble
は小数点以下の桁を格納しません。それらはbinaryの場所を保存します:float
は(IEEE 754を想定)24有効ビット(7.22 10進数字)とdoubleは53有効ビット(15.95有効数字)です。
double
からfloat
に変換すると、可能な限り最も近いfloat
が得られるため、丸めは役に立ちません。他の方法を使用すると、10進数表現で「ノイズ」桁が表示される場合があります。
#include <stdio.h>
int main(void) {
double orig = 12345.67;
float f = (float) orig;
printf("%.17g\n", f); // prints 12345.669921875
return 0;
}
意図したニースの10進数値のdouble
近似値を取得するには、次のように記述できます。
double round_to_decimal(float f) {
char buf[42];
sprintf(buf, "%.7g", f); // round to 7 decimal digits
return atof(buf);
}
float
は通常、小数点の位置に関係なく、約7桁の精度を持ちます。そのため、小数点以下5桁の精度が必要な場合は、数値の範囲を+/- 100前後のどこかに制限する必要があります。