0

以下のプログラムでは、理解できない精度損失1が発生しています。助けが必要。

void main()
{
    typedef std::numeric_limits< double > dbl;
    cout.precision(dbl::digits10);

    double x = -53686781.0;
    float xFloat = (float) x;

    cout << "x :: " << x << "\n";
    cout << "xFloat :: " << xFloat << "\n";
}


Outpput:
x :: -53686781
xFloat :: -53686780
4

2 に答える 2

6

53686781 は 2 進数では 11001100110011000111111101 のようになります。これは 26 ビットです。

float は仮数部分に最大 24 ビットしか格納できないため、最終的には 110011001100110001111111 が格納されます。最後の 2 進数 01 は切り捨てられます。

11001100110011000111111100 は 53686780 です。

それと同じくらい簡単です。

于 2013-03-20T11:40:22.733 に答える
0

通常のフロートの場合、p=23 で、2^23 桁の精度 (既に述べたように約 7 桁) になります。Double は p=52 で、2^52 桁の精度 (約 15 桁) になります。

wikiページは実際にはかなり良いです。

于 2013-03-20T11:40:43.933 に答える