2

有効数字 16 桁の float 値を出力する必要があります。

今印刷すると、印刷されます

つまり、2.555556

印刷したい場合:2.555555555555556 ///合計16桁

現在、私の printf 指定子は「%20.18lf」です。

アイデア?

4

3 に答える 3

3

値のタイプが の場合float、小数点以下の有効桁数が約 7 桁を超えることはないでしょう。タイプが の場合double、約 15 を取得できます。システムによっては、long doubleより正確でない場合がありdoubleます。私の場合、小数点以下の有効桁数は約 17 桁です。

ほとんどの浮動小数点コードは type を使用しdoubleます。floatははるかに精度が低く、多くの場合、大幅に高速ではありません。

フォーマットのような2.555556ものではなく、あなたが得たことに少し驚いています。2.555555582046508789"%20.18lf"

なお、l(小文字のL)は不要です。の形式は でdoubleあり"%f"、 へのfloat引数printfは に昇格されるdoubleため、 と の両方で"%f"正しいです。の形式は.floatdoublelong double"%Lf"

ここに私が書いたテストプログラムがあります:

#include <stdio.h>
int main(void) {
    const float f        = 23.0/9.0;
    const double d       = 23.0/9.0;
    const long double ld = 23.0L/9.0L;
    printf("%20.18f\n%20.18f\n%20.18Lf\n", f, d, ld);
    return 0;
}

そして、システムで得た出力:

2.555555582046508789
2.555555555555555358
2.555555555555555556
于 2012-02-23T19:20:03.753 に答える
0

C の float や double では精度が不十分です。基本的には高精度の除算関数が必要です。これが私が書いたものです。整数除算用です。float 除算のために修正する必要があるかもしれません。

int dividend=121, divisor=9;
int quotient,remainder;

//first print out the number before decimal point
quotient=dividend/divisor;
printf("%d", quotient);
remainder=dividend-quotient*divisor;

//print out decimal point
printf(".");

int digit_num=20;//this can be any precision you want

//second we calculate the number after decimal point
for(int i=0;i<digit_num;i++)
{
    remainder=remainder*10;
    quotient=remainder/divisor;
    remainder=remainder-quotient*divisor;
    printf("%d", quotient );
    dividend=remainder;
}

printf("\n");

printf("%d digits after decimal point has been printed out\n", digit_num );
于 2012-02-23T19:57:20.283 に答える
0

次のコードはうまく機能します (%lf指定子は以前の標準の一部ではないため、C99 を有効にする必要があります)。

#include <stdio.h>

int main(void)
{
        volatile float v = 2.555555555555556;
        printf("%20.18lf\n", v);
        return 0;
}

以下を出力します。

$ gcc -std=c99 -Wall -pedantic -o test ./test.c 
$ ./test 
2.555555582046508789
$ 

値が短い場合、たとえば 2.5 の場合、右側にゼロが埋め込まれます - 2.500000000000000000

したがって、他の場所でエラーが発生します。一般に、問題を再現する最小限の自己一貫性のあるコード例を投稿する必要があります。そうでなければ、あなたは独りです。

于 2012-02-23T19:20:43.507 に答える