2016-10-12 5 views
0

"nに四捨五入"に関するほとんどの質問があります。この質問は、任意の長さの浮動小数点の丸めにもっと関連しているので、この質問は分かれていると私は信じています。任意の長さをn桁に丸める

0.56714329040978387299996866221035554975381578718651250813513107922304579308668456669321944696175229455773495728285284421635951688 

上記の数値は、使用している数値の種類の例です。

私はC++で数値を丸める方法を理解していますが、それはかなり簡単です。しかし、私はどのように任意の長さの数字をnに丸めることができるのか分かりません。

たとえば、私は84桁に丸めなければならない192桁の長さか、293桁に丸めなければならない1831桁の数字を持つかもしれません。どのようにこれは1つの機能(または同様のもの)を使用して行うことができますか?

明確にするための疑似コードが、私は実際に任意精度のためのマルチ精度cpp_dec_floatブースト使用していますではなく、標準的な山車の山車:


float round(float num, int digits){ 
    //returns num rounded to n digits 
} 
は、私が遭遇したもう一つの問題は、丸めるしようとしているとき非常に長いと小さな数字に浮かびます。

たとえば、1000桁の数字があり、それをn桁に丸めたい場合は、floor(num * 10^1000)/10^1000)のようなものを実行する必要があります。 10^1000が非常に大きいため、これは機能しません。これに対する解は、より小さな指数で複数回の除算と除算を行うことになります。

round(x, precision_unit)=trunc(x/precision_unit+0.5)*precision_unit; 

何かのように: -

+0

私は正しい質問を得るでしょう。 2つのうちのどれか:桁数(相対精度)または「丸め単位」(絶対精度)。例えば。 (0.253e + 5、100units)== 0.253e + 5) '?(0.253e + 5、100units)== 0.25e + 5' –

+0

@AdrianColomitchi私は3桁に丸められた '0.0236'の行に沿ってもっと話していますが、それはあなたが話しているものなら' 0.024'を返します。 – esote

+0

"実際には、任意精度の浮動小数点数に対してBoostの多重精度を使用しています" - より具体的にする必要があります。 – Veedrac

答えて

1

丸めを行うには、[編集より良い解決策]

に基づいて行くことができる

using namespace boost::multiprecision; 

    const uint lower_prec_digits=28; 

    typedef number<cpp_dec_float<100>> higher_prec; 
    typedef number<cpp_dec_float<lower_prec_digits>> lower_prec; 

    const higher_prec eps_div= 
     std::numeric_limits< 
      number<cpp_dec_float<lower_prec_digits+1>> 
     >::epsilon() 
    ; 

    higher_prec pi(
    "3.1415926535" 
     "8979323846" 
     "2643383279" 
     "5028841971" 
     "6939937510" 
     "5820974944" 
     "5923078164" 
     "0628620899" 
     "8628034825" 
     "3421170679" 
); 

    lower_prec round_pie=lower_prec(trunc(pi/eps_div+0.5)*eps_div); 

    std::cout.precision(100); 
    std::cout << round_pie << std::endl << pi << std::endl; 

結果:だけを確認すること

3.1415926535897932384626433833 
3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068 
+0

余分なものが必要な場合を除き、 'std :: endl'を使わないでください。 '' \ n ''は行を終わらせます。 –

関連する問題