#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
为什么答案是错的?
答案 0 :(得分:4)
因为虽然longDoublePI
是long 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。