有効数字 16 桁の float 値を出力する必要があります。
今印刷すると、印刷されます
つまり、2.555556
印刷したい場合:2.555555555555556 ///合計16桁
現在、私の printf 指定子は「%20.18lf」です。
アイデア?
値のタイプが の場合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"
正しいです。の形式は.float
double
long 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
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 );
次のコードはうまく機能します (%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
。
したがって、他の場所でエラーが発生します。一般に、問題を再現する最小限の自己一貫性のあるコード例を投稿する必要があります。そうでなければ、あなたは独りです。