-1

したがって、C++ でのfloatdoubleの違いは理解できます。

double は単純に double の浮動小数点ですが、float は単一の浮動小数点 (精度のサイズが 2 倍) です。

私の質問は、フロートが '300000011920928955078125e-24' (値 3.0 の場合) として表されるのはなぜですか?

double がすべての末尾の数字を表示しないのはなぜですか? 精度は高くなりますが、浮動小数点と同じ有限精度に悩まされているため、なぜそのように表示されないのかわかりません。

4

1 に答える 1

2

これは、多くの値が浮動小数点 (単精度または倍精度) では正確に表現できないためですが、double ははるかに近いものを表すことができます。表示される小数点以下の桁数を増やして印刷すると、ほぼ確実にエラーが表示されます。

値 0.3 を正確に表すことはできません。さらに、計算の結果、オペランドからエラーが検出される場合があります。「0.3 * 10」は結果の誤差を拡大するため、正確には 3.0 にはなりません。

最良のアナログは、「1/3」を 10 進数で表示しようとすることです。0.333333 または 0.333333333333 と書くかもしれません。これらを 3 倍すると、0.999999 または 0.999999999999 になります。それらを電卓画面 (桁数が固定されている) に表示すると、1 つ目はエラーと共に表示され、2 つ目は切り上げられます。

編集:これを示すコード:

#include <stdio.h>

int main()
{
    float f = 0.3;
    double d = 0.3;
    printf("%.50lf %.50lf\n", f, d);
    printf("%.10lf %.10lf\n", f, d);
}

表示:

0.30000001192092895507812500000000000000000000000000 0.29999999999999998889776975374843459576368300000000
0.3000000119 0.3000000000
于 2012-09-27T23:20:55.250 に答える