私はcpp_dec_float
任意の精度で使用していますが、それは素晴らしいのですが、すべての有効数字を出力する方法がわかりません。
たとえば、このコードを使用してセットアップします
using boost::multiprecision::cpp_dec_float;
typedef boost::multiprecision::number<cpp_dec_float<100>> mp_type;
mp_type test_num("7.0710678118654752440084436210484903928483593768847403658833986900e-01");
そして、単純に印刷すると
std::cout << std::scientific << test_num << std::endl;
結果は7.071068e-01
です。
私が壊れた場合
std::cout << std::setprecision(std::numeric_limits<mp_type>::digits) << std::scientific << test_num << std::endl;
私は得る7.0710678118654752440084436210484903928483593768847403658833986900000000000000000000000000000000000000e-01
。精度を落とさなくてよかったのですが、スペースの節約にはなりません。
既存のツールで精度を失うことなく末尾のゼロを削除する方法はありますか? そうでない場合、結果の文字列から末尾のゼロを削除するにはどうすればよいですか?
私の意図を満たすために既存のツールを使用できる場合、cpp_dec_float
精度を失わず、文字列の末尾のゼロを削除せずに科学表記法で出力するにはどうすればよいでしょうか? ストリームの例しか見つかりません。
クローザー
モックインターフェイスのおかげで、私はずっと近くにいます。
コードを次のように変更しました。
using boost::multiprecision::cpp_dec_float;
typedef boost::multiprecision::number<cpp_dec_float<0>> mp_type;
mp_type test_num("7.0710678118654752440084436210484903928483593768847403658833986900e-01");
std::cout << test_num.str(0, std::ios_base::scientific) << std::endl;
潜在的に無制限の長さを持つこと。ただし、これは印刷されます。
7.0710678118654752440084436210484903928480e-01
これは近いですが奇妙に思えます。親切に指摘されたソースのモックインターフェイスで、これらの行を見つけました
if(number_of_digits == 0)
number_of_digits = cpp_dec_float_total_digits10;
これは、すべての有効数字を考慮に入れる必要があることを示唆しており、基本的には長さが無制限であるため、入力されたものを出力します。
のソースを確認しましたcpp_dec_float_total_digits10
が、それが何であるかを正確に判断できません。ただし、それを定義しているように見えるこのコードセクションを見つけました。
private:
static const boost::int32_t cpp_dec_float_elem_digits10 = 8L;
static const boost::int32_t cpp_dec_float_elem_mask = 100000000L;
BOOST_STATIC_ASSERT(0 == cpp_dec_float_max_exp10 % cpp_dec_float_elem_digits10);
// There are three guard limbs.
// 1) The first limb has 'play' from 1...8 decimal digits.
// 2) The last limb also has 'play' from 1...8 decimal digits.
// 3) One limb can get lost when justifying after multiply,
// as only half of the triangle is multiplied and a carry
// from below is missing.
static const boost::int32_t cpp_dec_float_elem_number_request = static_cast<boost::int32_t>((cpp_dec_float_digits10 / cpp_dec_float_elem_digits10) + (((cpp_dec_float_digits10 % cpp_dec_float_elem_digits10) != 0) ? 1 : 0));
// The number of elements needed (with a minimum of two) plus three added guard limbs.
static const boost::int32_t cpp_dec_float_elem_number = static_cast<boost::int32_t>(((cpp_dec_float_elem_number_request < 2L) ? 2L : cpp_dec_float_elem_number_request) + 3L);
public:
static const boost::int32_t cpp_dec_float_total_digits10 = static_cast<boost::int32_t>(cpp_dec_float_elem_number * cpp_dec_float_elem_digits10);
の最初の引数として有効桁数を決定して使用できますboost::multiprecision::cpp_dec_float::str()
か?