问题标签 [boost-multiprecision]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
231 浏览

c++ - 在提升多精度中自定义指数中的位数

我们刚刚迁移到 Visual Studio 2017,由于此处描述的更改,双精度值的序列化输出 usingstd::scientific不再在指数中携带 2 位数字,而只有一位。

我们boost::serialization用来序列化为 XML。

我们正在考虑切换到boost::multiprecision处理更大的数字,但我们仍然必须使用指数中的数字来解决这个问题。

有没有办法回到旧的符号 'e+002' 甚至自定义它boost::multiprecision

0 投票
1 回答
320 浏览

c++ - 是否可以为 boost::random::uniform_int_distribution<> 设置确定性种子?

boost::random::uniform_int_distribution<boost::multiprecision::uint256_t>用来生成一些单元测试。请注意,我正在使用multiprecision,这就是为什么我需要使用 boost 而不是标准库。对于我的定期测试,我需要从非确定性种子生成确定性结果,但是以这样一种方式,我可以在以后重现结果以防测试失败。

所以,我会生成一个真正的随机数并用作种子,然后将其注入到uniform_int_distribution. 目的是如果失败,我将能够使用导致测试失败的相同种子重现问题。

这部分 boost 是否支持在其界面中生成基于种子的随机数?如果没有,还有其他方法可以做到这一点吗?

我目前生成随机数的方式是:

PS:请注意,主要要求是支持multiprecision. 我需要从 16 位到 512 位的数字。这是用于测试的,因此性能并不是真正的要求。我可以通过其他方式生成大随机数并将它们转换为boost::multiprecision.

0 投票
1 回答
112 浏览

r - 我收到 boost 和 Rcpp 的致命错误

如帖子中所述:

Rcpp 和 boost:它应该可以工作,但不能

我正在尝试在 Windows 的 Rcpp 中使用 boost。(简化的)文件是:

我有一个编译问题。正如@duckmayr 在那篇文章中建议的那样,我尝试了:

Sys.setenv("PKG_LIBS" = "-lquadmath")

接着Rcpp::sourceCpp('quadexp.cpp')

这样,编译运行不会出错。但是,当我执行 qexp() 时,我在 RStudio 中收到一条关于“致命错误”的消息,并且 RStudio 完全关闭。你知道会发生什么吗?我认为我的问题是由于我的某种配置造成的,因为@duckmayr 可以毫无问题地运行相同的代码。为了避免这种令人讨厌的“致命错误”,我的配置应该查看哪些部分?

0 投票
3 回答
694 浏览

c++ - 如何将字节数组转换为 boost::multiprecision::uint128_t?

如果我有:

char buffer[16];

如何将其原始字节转换为:

boost::multiprecision::uint128_t?

我试着做一个标准的 C 风格的演员:

uint128_t myInt = *(uint128_t*)buffer;

虽然它似乎不能正常工作。还尝试使用 dynamic_cast

我找到了这个页面:https ://www.boost.org/doc/libs/1_56_0/libs/multiprecision/doc/html/boost_multiprecision/tut/conversions.html

关于如何进行对话,但似乎没有涵盖这类事情。有任何想法吗?

编辑:其中一条评论建议使用 memcpy(如果它像 GCC 的 128 位 uint)将字节复制到 uint128_t 中。如果按照我期望的方式完成,那似乎无法正常工作: memcpy() 试试 我错过了什么吗?

0 投票
2 回答
726 浏览

c++ - 在对短字符串编码的有理数执行算术时,浮点的简单替代方案

我正在为一个将存储为字符串的“有理”数字舍入的函数创建单元测试。当前的舍入实现将字符串转换为浮点类型:

在我的一项测试中,我在我的机器上输入了数字 3.55,它表示为 3.5499999...。从 2 位小数舍入到 10 时一切顺利。但是,当我舍入到第一个小数时,不出所料,我得到 3.5 而不是 3.6。

避免此错误的简单方法是什么?

目前,我能找到的最佳解决方案是使用多精度类型:

虽然这个解决方案以一种直接的方式解决了这个问题(相对于手动解析字符串或创建一个有理数类),但我发现对于这样一个简单的问题来说它过分了。

为了找到解决这个问题的方法,我查看了一些计算器的实现。我查看了 gnome-calculator 的源代码,发现它使用了 GNU MPFR。然后我查看了 SpeedCrunch 的实现,发现它重用了与 bc 相同的代码,它采用了有理类型(分子、分母)。

我忽略了什么吗?

0 投票
1 回答
173 浏览

c++ - 您如何使用任何 Boost 多精度库类型找到两个非常大的数的模逆?(cpp_int、gmp_int 等)

我需要找到两个数字的模乘逆,其数据类型是 Boost 的多精度库(gmp_int、cpp_int 等)提供的任何数据类型。是否有内置功能可以做到这一点?如果没有,你能解释一下如何进行吗?

0 投票
1 回答
80 浏览

boost - boost::multiprecision::uint128_t sizeof 为 16

根据此链接,

boost::multiprecision::uint128_t sizeof 为 24

uint128_t 应该是 24。

我在 Linux Ubuntu 16.04 x64 上尝试过,它显示为 16。

任何原因?

0 投票
1 回答
302 浏览

c++ - boost::multiprecision:乘以或除以 10 的巨大幂的最便宜的方法是什么?像 10 次方的 bitshift op 之类的东西?

考虑以下 MCVE:

由于明显的溢出,它会产生错误的结果int。假设我不想涉及字符串,我该如何正确地做到这一点?是否有类似“数字移位运算符”或幂函数可以便宜地(或尽可能便宜地)做到这一点?

为什么?因为我有一个我编写的固定精度库,并且缩放内部整数需要这样的操作是 100% 安全的。

在此处查找示例。

0 投票
0 回答
139 浏览

c++ - 代码适用于 Boost 多精度库浮点数,但不适用于 GMP 后端

我正在学习如何使用 Boost Multiprecision Library。作为练习,在遵循以下分布构造示例之后,我能够使用库的内置高精度十进制浮点表示成功实现一个以高精度计算负二项式 PDF 的函数cpp_def_float

它按预期工作,打印以下输出:

但是,我想更改上面的代码以使用 GMP 后端。正如我从这里理解的那样,只需包含正确的gmp.hpp并使用正确的 GMP 浮点类型而不是cpp_def_flota. 如下所示:

然而,这不起作用,引发了以下编译错误(我在这里只首先显示少数几个;稍后我链接到完整的错误日志):

完整的错误日志可以在这里看到。

我的问题是我做错了什么,如何使用 GMP 后端来完成这项工作?如果有帮助,我将在 64 位 Ubuntu 18.04 安装中使用 Visual Code。

0 投票
1 回答
248 浏览

python - C++ Boost Multiprecision 和 Python 的 mpmath 之间的互操作性

我有分别使用 Boost Multiprecision 和 Python 的 mpmath 的经验。

当要让两者进行通信时(例如在 C++ 中创建 Python 扩展),我的尝试总是涉及某种浪费的浮点到字符串和字符串到浮点的转换。

我的问题是:是否有可能使两者以更高效(和优雅)的方式进行通信?我的意思是,有没有办法直接让 C++ Boost Multiprecision 从 Pythonmpmath.mpf对象加载和导出,就像 C 的mppviapybind11一样?

我一直在寻找这个。我发现的唯一其他类似问题是关于使用 Boost Multiprecision 导出到 Python(通常)pybind11,而不是mpmath直接导出到对象。在那个问题中,OP 最终使用了我试图避免的相同方法(即,在与 C++ 和 Python 通信时从/到字符串转换)。