8

私はこの番号を持っているとしましょう:

// bmp = boost::multiprecision
bmp::cpp_dec_float n("123456789.1234567891011121314");

そのバックエンド データは次のとおりです。

[0]  1         unsigned int
[1]  23456789  unsigned int
[2]  12345678  unsigned int
[3]  91011121  unsigned int
[4]  31400000  unsigned int
...  0
[15] 0         unsigned int

これはまさに私が取得したいものです。残念ながら、番号の両方の部分を (bmp::int128_tたとえば) 取得する方法、または番号の基になるデータを取得する方法が見つかりません。

つまり、私はこのようなものが存在するのが好きです:

bmp::int128_t integerPart;
bmp::int128_t floatPart;
n.getParts(integerPart, floatPart);

また

auto&& data = n.data(); // which is actually private when using `cpp_dec_float`.

とにかく、誰かが私が達成しようとしていることを行う方法を知っていますか?

記録のために、相互運用性のために C# の 10 進数として大きな 10 進数を表現するには、これが必要です。

4

3 に答える 3

1

ブーストのドキュメントによると、バックエンドは警告なしにいつでも変更される可能性があるため、意図的に不透明になっています。( Class template cpp_dec_float fulfils all of the requirements for a Backend type. Its members and non-member functions are deliberately not documented: these are considered implementation details that are subject to change.) http://www.boost.org/doc/libs/1_55_0/libs/multiprecision/doc/html/boost_multiprecision/ref/cpp_dec_ref.htmlから

私が見る限り、ここには 2 つの選択肢があります。number使用しているバックエンド クラスの特定のバージョンのソース コードを確認し、メソッドを使用してアクセスしbackend、バックエンドが変更されないことを期待できます (特に、コンパイルではなくバイナリ形式のみを壊した変更を検討してください)。

または、関心のある基本的な整数型のまたはコンストラクターをcpp_dec_float使用して、 の文字列表現を自分で 2 つの部分に分割することをお勧めします。stringchar*

于 2014-06-23T15:54:38.963 に答える
-1

おそらくeval_frexp探している値を取得するために使用できると思いますが、それらが C# Decimal 型に適合することを確認する必要があります。ここの Boost.Multiprecision バックエンド要件に関するマニュアルを参照してください: http://www.boost.org/doc/libs/1_53_0/libs/multiprecision/doc/html/boost_multiprecision/ref/backendconc.html

いつでも手書きの数学と範囲チェックを行うことができます。あまりにも多くの番号を転送していない場合は、これで十分速いかもしれません。

そうは言っても、いたずらをして次のようなことをするのは大歓迎です。

#define private public
#define protected public
#include <boost/multiprecision/cpp_dec_float.hpp>
#undef private
#undef protected

ただし、将来のリリースで問題が発生した場合は、両方の部分を保持できます。


ねえ、コメントなしで反対票をありがとう。それは本当に役に立ちます。

上記の私のコメントを明確にするために:

Using eval_frexp: さらに調査した結果、eval_frexp(b, cb, pi)はまだ 2 の累乗のみを提供しているようであり、Decimalタイプに必要と思われる 10 の累乗は提供していないようです。したがって、パブリック インターフェイスのみを使用する場合は、長い形式で演算を行う必要があると思われます。

メンバーの悪用private: Boost.Multiprecision クラスの作成者と管理者は、特定のガイドラインに従ってクラスを設計しました。彼らは、内部構造へのアクセスを提供することよりも、将来性を保証することを重要視しているようです。

クラス テンプレート cpp_dec_float は、バックエンド タイプのすべての要件を満たします。そのメンバーと非メンバー関数は、意図的に文書化されていません。これらは、変更される可能性のある実装の詳細と見なされます。( http://www.boost.org/doc/libs/1_53_0/libs/multiprecision/doc/html/boost_multiprecision/ref/cpp_dec_ref.html )

私の提案は、「いたずら」と明確にマークされ、将来のリリースで壊れる可能性があるという警告とともに、B.MP の作成者の設計ニーズよりも先に OP の設計ニーズを課すことでした。

最もクリーンな方法はcpp_dec_float、内部構造が公開されているクラスに変更を提案することです。説得力のあるユースケースと、コードが歴史的にどれだけ変更されたか、または変更されていないかの分析が与えられれば、それは受け入れられるかもしれません.

お役に立てれば。読者がまだ問題を抱えている場合は、お気軽に反対票を投じてください.

于 2013-05-12T10:41:46.917 に答える