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# 十进制数。

4

3 回答 3

1

从 boost 文档来看,后端是故意不透明的,因为它可能随时更改而不会发出警告。( 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

据我所知,您在这里有两个选择。您可以查看您正在使用的后端类的特定版本的源代码,从您的numberusingbackend方法中访问它,并希望后端永远不会更改(特别是考虑仅破坏二进制格式而不是编译的更改)。

或者,我建议您使用您感兴趣的基础整数类型的or构造函数cpp_dec_float自己将其拆分为两部分。stringchar*

于 2014-06-23T15:54:38.963 回答
0

不知道是不是你要找的,试试看

cpp_dec_float_100 myreal(100);
cpp_dec_float_100 int_part = myreal.backend().extract_integer_part();

类型仍然是 cpp_dec_float_100,但只包含整数部分。我希望这有帮助。

于 2014-01-23T03:03:04.793 回答
-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

但如果它在未来的版本中出现问题,您可以保留这两部分。


嘿,感谢您的反对意见,没有评论。这真的很有帮助。

为了澄清我上面的评论:

使用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

我的提议,被明确标记为“顽皮”,并警告说它可能会在未来的版本中中断,是把 OP 的设计需求强加于 B.MP 的作者的设计需求之前。

最简洁的方法可能是提议对cpp_dec_float类进行更改,其中暴露了内部结构;给定一个令人信服的用例,并分析代码在历史上发生或未发生的变化,它甚至可能被接受。

希望这可以帮助。如果读者对此仍有疑问,请随时投反对票,但请让我知道哪个部分困扰您,以便我尝试改进它。

于 2013-05-12T10:41:46.917 回答