20

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

4

3 に答える 3

37

floatdouble小数点以下の桁数は保存しないでください。それらは2進位を格納します:floatis(IEEE 754を想定)24有効ビット(7.22小数点以下桁)および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);
}
于 2010-08-17T00:53:21.777 に答える
12

Afloatは、小数点の位置に関係なく、通常、約7桁の精度があります。したがって、小数点以下5桁の精度が必要な場合は、数値の範囲を+/-100前後に制限する必要があります。

于 2010-08-16T23:34:34.477 に答える
-3

浮動小数点数は、科学的記数法では、有効数字7桁に、小数点以下の桁数を表す大きな数を掛けたものとして表されます。ウィキペディアでそれについてのより多くの情報:

http://en.wikipedia.org/wiki/Floating_point

于 2010-08-16T23:38:38.493 に答える