web-dev-qa-db-ja.com

C:doubleをfloatに変換し、小数点の精度を維持します

私は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と想定)の後のすべての数字は切り捨てられます。

18
sdfg

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);
}
28
dan04

floatは通常、小数点の位置に関係なく、約7桁の精度を持ちます。そのため、小数点以下5桁の精度が必要な場合は、数値の範囲を+/- 100前後のどこかに制限する必要があります。

11
Michael Burr