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 在二进制中看起来像这样:11001100110011000111111101。这是 26 位。

您的浮点数最多只能在其尾数部分存储 24 位,因此,您最终将 110011001100110001111111 存储在其中。最后两个二进制数字 01 被截断。

11001100110011000111111100 是 53686780。

就如此容易。

于 2013-03-20T11:40:22.733 回答
0

对于普通的浮点数,我相信 p=23,它给出了 2^23 的数字精度(大约 7 位,如前所述。Double 有 p=52,它给出了 2^52 的数字精度(大约 15 位)。

维基页面实际上非常好。

于 2013-03-20T11:40:43.933 回答