我有一个long double
常量,我设置为const或not-const.它比long double
我的测试工作站(19位)的精度更长(40 位).
当我打印出来时,它不再以19位精度显示,而是以16位显示.
这是我正在测试的代码:
#include#include #include #include int main () { const long double constLog2 = 0.6931471805599453094172321214581765680755; long double log2 = 0.6931471805599453094172321214581765680755; std::cout << std::numeric_limits ::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
但我使用long double literals而不是double literals:
const long double constLog2 = 0.6931471805599453094172321214581765680755L; long double log2 = 0.6931471805599453094172321214581765680755L;