1

double から GMP 浮動小数点変数 (mpf_t または mpf_class は関係ありません) を初期化する正しい方法は何ですか?

コード:

#include <iostream>
#include <gmpxx.h>

int main()
{
        double d=0.1;

        //1024 bits is more that 300 decimal digits
        mpf_set_default_prec(1024);

        mpf_class m(d);

        //after initializing mpf_class variable, set default output precision
        std::cout.precision(50);
        std::cout.setf(std::ios_base::scientific);

        std::cout << m << std::endl;

        return 0;
}

出力は次のとおりです。

1.00000000000000005551115123125782702118158340454102e-01

直接印刷しても問題ありませんdが、m変数では仮数部の 300 桁が信頼されています。私は反復数値法に GMP を使用しているため、これらの非ゼロは間違いを招き、方法の収束を遅くします。

mとして初期化するmpf_class m("0.1");と、出力は次のようになります。

1.00000000000000000000000000000000000000000000000000e-01

したがって、問題は のoperator<<過負荷ではありませんmpf_class。問題は初期化だけでなく、割り当てにも存在します。

現在、私は以下を使用しています:

mpf_class linsys::DtoGMP(const double& arg)
{
        char buf[512];
        sprintf(buf,"%.15le\n",arg);
        return mpf_class(buf);
}

正しい変換のために。

それを行うためのより高速かつ/またはよりネイティブな方法はありますか?

私の OS は OpenSUSE 12.1、コンパイラ: gcc 4.6.2 です。

4

2 に答える 2

2

double を同じ精度で出力すると、同じ奇妙に見える数値が表示されるはずです。これは単に0.1 を浮動小数点で正確に表現できないためです。mpf_class は double に格納された値を正確に再現しています。あなたの期待に応えていないのはダブルです。

gmp に精度を指定する方法や、入力を丸める方法がおそらくあるでしょう。どこを見たらいいのかわからない

編集

mpf_class精度パラメータを持つコンストラクタがあります: http://www.gnu.org/software/gmp/manual/html_node/C---Interface-Floats.html

于 2012-12-01T20:11:47.617 に答える
-1

この方法を使用できます

mpf_class a; double d=0.1; a=static_cast<mpf_class>(d*10)/static_cast<mpf_class>(10); この方法は、double の小数点以下の桁数がわかっている場合に使用できます

于 2020-01-09T23:12:12.960 に答える