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 です。