0

Microsoft Visual Studio 2010 と Intel C++ Compiler XE 14.0 を使用しています。プロジェクト構成は「x64」です。long doubleデータ型を操作する必要があります。コンパイル オプションを追加し/Qlong_double、テスト例を作成しました。

    long double ld = 2;
    long double res = std::sqrt(ld);
    printf("long double size: %i, value: %Lf", sizeof(res), res);
    printf("double value of res: %f", (double)res);

出力:

long double サイズ: 16、値: 0,000000

res の double 値: 1,414214

問題は、Windows 用の標準 C ライブラリが long double をサポートしていないことです。MPFR を使用しようとしました:

    long double ld = 2;
    long double res = std::sqrt(ld);
    mpfr_t test;
    mpfr_init2(test, 100);
    mpfr_set_ld(test, res, GMP_RNDN);
    mpfr_printf("\nmpfr long double: %Rf\n", test); 

出力:

mpfr long double: 0

Microsoft Windows で long double 値を正しく出力する方法 (低レベルの方法を含む) はありませんか? たぶん、仮数と指数を別々に取得して出力できますか?

更新:

long double で計算が実行されるかどうかを確認する例を書きました。

     int count = 0;
     long double e = static_cast<long double>(1.0);
     while (static_cast<long double>(1.0) + e / static_cast<long double>(2.0) > static_cast<long double>(1.0)){
         e /= static_cast<long double>(2.0);
         count++;
     }
     cout<< endl<< "COUNT LONG DOUBLE: " << count<<endl;

     double de = 1.0;
     count = 0;
     while (1.0 + de / 2.0 > 1.0){
         de /= 2.0;
         count++;
     }
     cout<< endl<< "COUNT DOUBLE: " << count<<endl;

出力:

カウント ロング ダブル: 52

ダブルカウント: 52

これは、作業が long double ではなく double で行われることを意味します (ただし、/Qlong_doubleフラグは設定されています)。いくつかのアイデアは何ですか?

4

0 に答える 0