当cout长双精度值C ++时有错误的答案

时间:2017-04-05 16:35:20

标签: c++

#include <iostream>
#include <iomanip>
#include <limits>

using namespace std;

int main() {
    const long double longDoublePI = 3.141592653589793238;
    cout << setw(16) << "longDoublePI = " << setprecision(numeric_limits<long double>::digits10 + 1) << longDoublePI << endl;

    return 0;
}

但结果输出是:

longDoublePI = 3.141592653589793116

为什么答案是错的?

2 个答案:

答案 0 :(得分:4)

因为虽然longDoublePIlong double,但是您初始化它的文字只是double ,其精度不高。

您可以改用:

const long double longDoublePI = 3.141592653589793238L;
//                                                   ^

答案 1 :(得分:2)

首先,这取决于平台。标准(C ++ 14,3.9.1基本类型[basic.fundamental]第8段)规定long double仅具有与float相同的精度。在实践中,我希望它具有相同或更高的精度而不是双倍,至少在桌面/服务器平台上。

通常我会使用像M_PI这样的标准宏来获得众所周知的常量。我不知道任何标准的长双版本,但GNU似乎将M_PIl作为非标准扩展。

最后,除了M_PI之外,获得pi的标准技巧是使用

4.0L *的std :: ATAN(1.0L)

有关详细讨论,请参阅here