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 や他のライブラリを調べることはできますが、何が原因なのか知りたいです。あなたの洞察に感謝します。