1

double私のマシンのタイプは、このWikipediaの記事にlong double対応し、次のテキストに対応していることがわかりました:x86 ExtendedPrecisionFormat

そのためfloor(52/log2(10))、15桁doubleが正しいfloor(63/log2(10))か、19桁long doubleが信頼されている必要があります。

コード:

int main()
{
    double d=0.1;
    long double ld=0.1;

    std::cout.precision(19);
    std::cout.setf(std::ios_base::scientific);

    std::cout << d << std::endl;
    std::cout << ld << std::endl;

    return 0;
}

出力を与えます:

1.0000000000000000555e-01
1.0000000000000000555e-01

cout.precision16に設定すると、出力は次のようになります。

1.0000000000000001e-01
1.0000000000000001e-01

1番目の出力の17桁目と2番目の出力doubleの16桁目doubleが正しくないことは問題ありません。しかし、なぜそれは間違っているのlong doubleですか?long double変数の19桁すべてを取得する方法はありますか?

long doubleを試しprintf("%.19Le\n",ld);てみると、まったく同じ結果が得られます。

私はOpenSUSE12.1とg++4.6.2を使用しています。

4

1 に答える 1

2

リテラル定数は0.1longdoubleではなく、おそらくdoubleです。

ldあなたはで初期化したいかもしれません

 long double ld = (long double) 1.0 / (long double) 10.0;

除算に2つのlongdoubleオペランドが含まれるように、うまくいけばlong doubleで実行されます(それはわかりません。適切なC ++標準を再確認する必要があります)。

そして、おそらく最新の標準をサポートするGCCでコンパイルしたいと思うでしょう。GCC 4.7ではコンパイルすることをg++ -Wall -std=c++11お勧めしますが、4.6では言う必要があるかもしれません-std=c++0x

于 2012-12-01T18:51:39.713 に答える