我有一个long double
常量,我将其设置为const或not-const。它比我的测试工作站上long double
的精度(19位数字)更长(40位数字)。
当我打印出来时,它不再以19位精度显示,而是以16位精度显示。
这是我正在测试的代码:
#include <iostream>
#include <iomanip>
#include <limits>
#include <cstdio>
int main ()
{
const long double constLog2 = 0.6931471805599453094172321214581765680755;
long double log2 = 0.6931471805599453094172321214581765680755;
std::cout << std::numeric_limits<long double>::digits10 + 1 << std::endl;
std::cout << "const via cout: " << std::setprecision(19) << constLog2 << std::endl;
std::cout << "non-const via cout: " << std::setprecision(19) << log2 << std::endl;
std::fprintf(stdout, "const via printf: %.19Lf\n", constLog2);
std::fprintf(stdout, "non-const via printf: %.19Lf\n", log2);
return 0;
}
编译:
$ g++ -Wall precisionTest.cpp
输出:
$ ./a.out
19
const via cout: 0.6931471805599452862
non-const via cout: 0.6931471805599452862
const via printf: 0.6931471805599452862
non-const via printf: 0.6931471805599452862
我期望
0.6931471805599453094
,但是得到0.6931471805599452862
。将19位精度降低到16位是有原因的吗?
这是我的环境:
$ gcc --version
i686-apple-darwin9-g++-4.0.1 (GCC) 4.0.1 (Apple Inc. build 5490)
我在其他版本的gcc上遇到了相同的问题,例如:
$ gcc --version
g++ (GCC) 3.4.6 20060404 (Red Hat 3.4.6-10)
我可以查看NTL或其他库,但很好奇是什么原因造成的。感谢您的见解。
最佳答案
我得到以下输出:
19
const via cout: 0.6931471805599453094
non-const via cout: 0.6931471805599453094
const via printf: 0.6931471805599453094
non-const via printf: 0.6931471805599453094
但是我使用长双字面量而不是双字面量:
const long double constLog2 = 0.6931471805599453094172321214581765680755L;
long double log2 = 0.6931471805599453094172321214581765680755L;