2016-12-17 20 views
0

は、次のコードを考えてみましょう:どのように正確にmprealの精度を拡張するには?

#include <iostream> 
#include <mpreal.h> 
using namespace std; 
using mpfr::mpreal; 

mpreal x("1.001",64); 
mpreal y("1.0",64); 
y*=x; 
cout<<y<<endl; //1 
y.set_prec(128); 
cout<<y<<endl; //2 

出力は

1.001

1.00100000000000000002081668171172168513

ある私は2番目の出力が

1.00100000000000000000000000000000000000

のようなものであることを望みます0

は実際には、私は1つが

y=mpreal(y.toString(),128); 

y.set_prec(128); 

を置き換えることができることを学んできた。しかしこの種の変換は時間がかかります。

より優れた方法はありますか?

ありがとうございます!

+0

あなたは 'mpreal x(" 1.001 "、64);'を実行したときに既にその精度を放棄しています。あなたは事実の後でそれを取り戻すことはできません。 – user2357112

答えて

0

精度はすべてグローバルに設定する方がよいので、デフォルトですべてのmpreal変数がこのような精度で作成されます。 Nは10進数の桁の精度を必要とする

mpfr::mpreal::set_default_prec(mpfr::digits2bits(N)); 

mpreal x("1.001"); // second argument is not required anymore 
mpreal y("1.0"); 
... 

:任意のmpreal番号を作成する前に、次の関数を呼び出します。

バイナリ浮動小数点数は実際の小数精度を与えません。実際の小数点の近似値に過ぎません。より多くのビット表現=より高い近似精度。 しかし、いくつかの数値は決してバイナリ形式で正確に表現することはできません。 1.001はその1つです。したがって、1.001番号のバイナリ表現で、何らかの位置から始まる非ゼロが常に表示されます。

詳細はWhat Every Computer Scientist Should Know About Floating Point Arithmeticを確認してください。

+0

[OK]を、デフォルトの精度を設定することは、プログラムを効率的に実行する方法です。ありがとう! – sunhex

関連する問題