问题标签 [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 投票
0 回答
43 浏览

c++ - 使用 boost::polygon 和 boost::multiprecision

我正在尝试使用boost::polygonwithboost::multiprecision来计算多边形差异,但无论我如何尝试将两者结合起来,我总是会遇到编译器错误,例如

https://github.com/boostorg/polygon/blob/develop/include/boost/polygon/detail/polygon_arbitrary_formation.hpp#L401

以及尝试回读结果时的类似位置:

这是我尝试过的

我这样做对吗?我尝试了不同的东西,coordinate_traits但最后看起来像evalAtXforYlazy这样的惰性函数中使用的类型和表达式拒绝支持这一点。

它编译得很好,没有 multiprecision

我还尝试polygon_arbitryry_formation.hpp在需要的地方修改和添加显式强制转换,这起初很有希望,但最终导致我在这里重载源自这里的结果问题。

我进一步尝试boost.multiprecisionMPIR替换,但它们甚至没有显式转换运算符,而只是用于转换的成员函数,与evalAtXforYlazy和其他函数的兼容性更差。

我究竟做错了什么?

0 投票
0 回答
82 浏览

c++ - 使用固定大小提升多精度整数保持基本类型行为

cpp_int 文档

该类型在内部使用符号幅度表示,因此类型 int128_t 具有 128 位精度和一个额外的符号位。在这方面,这些类型的行为不同于基本(内置)2 的补码类型。

此行为不同于 MSB 指示符号的基本类型。

为了具有与基本整数类似的行为,文档建议:

In 可能很想改用 127 位类型,这确实有效,但行为与 2 的补码基本(内置)类型仍然略有不同,因为最小值和最大值是相同的。

我怎样才能保持与基本类型完全相同的行为,但具有固定大小的提升多精度整数,例如int512_t?如果 boost 无法做到这一点,您是否建议任何其他库这样做?谢谢。

0 投票
1 回答
151 浏览

c++ - 为什么在评估复值积分时 boost::multiprecision::exp 会卡住?

我是 Boost C++ 库的新手,自然在使用它们时遇到了很多问题(由于缺乏可用的知识和示例:)

这些问题之一来自以下代码

当代码到达mpc_type ex2 = mpns::exp(-z*x2) ;时,它会卡住。即,它在计算指数时挂起。我花了一些时间试图找出问题所在,但找不到解决方案。

我做了几个测试。例如,<boost/multiprecision/mpfr.hpp>工作得很好。即,被积函数的实值版本可以集成到任意精度。我测试了mpfr代码的 -type 版本,直到boost::multiprecision::mpfr_float_backend <2000>.

调用 lambda 函数f是可能的,它返回正确的数字。

我使用了不同的被积函数,例如z*x z*tgamma(x)并且程序运行良好,具有相同的定义zx您可以在上面的示例中找到。

我使用 Tumbleweed 提供的最新版本的 Boost 库,即boost_1_76_0-gnu-mpich-hpc-devel

编译器:g++

cpp标准:gnu++17

什么可能是这个问题的根源?

很抱歉问了一个冗长的问题。

0 投票
1 回答
79 浏览

c++ - 将二进制补码十六进制数转换为 boost::multiprecision::int256_t

我试图让 boost::multiprecision 解析一个负数(二进制补码)十六进制数:

我希望这会输出-1234。不幸的是,它输出 115792089237316195423570985008687907853269984665640564039457584007913129638702

解析无符号十六进制数可以正常工作。

如何让 int256_t 将十六进制数解释为负二进制补码?

0 投票
0 回答
53 浏览

boost - Rcpp 中的向量和 boost::multiprecision::mpq_rational

我是 C++ 初学者,希望能在这里找到一些帮助。

为了激发我的问题,我希望编写一个函数,通过无限精度或有理算术在 C++ 中执行卷积。由于我希望从 R 调用此函数(通过Rcpp),因此我从以下方法开始(基于Dirk 的示例)。

意识到我必须为我的 C++ 变量转换一个无限精度的有理类型,接下来我尝试执行类型重新转换,依赖于boost库。从一个涉及标量的简单示例开始(如下所示)...

我遇到了一个错误"cannot convert type to SEXP"

我在这一点上迷路了。我知道在 R 中提供类对象的gmp R 包bigq,但不知道是否可以利用它来将mpq_rationals 转换为 SEXP。

我的问题是:

  • 如何将 boost 库有理类型转换为有效的 R 对象?(最好是bigq上课)
  • 我的推理是否有意义,或者有其他方法吗?(例如,对于convolve5cpp执行无限精度内部操作的向量,是否已经存在上述实现?)

非常感谢!


(2021 年 12 月 30 日更新)

感谢所有在下面留下有用评论的人。经过反复试验,我继续尝试在本地编辑gmp库中的一些源文件(可在此处获得)。

我编写了以下函数,它紧跟上面 Dirk 的示例。我镜像了 的结构operator+,另一个定义为添加两个bigrationals 的函数。

这没有用。在构建包时,我遇到了以下错误,看起来它们属于两大类。

  1. 'bigrational' 中没有名为 'size' 的成员:int n_xa = lhs.size()
  2. 类型 'const bigrational' 不提供下标运算符:bigrationalR::create_bigrational(lhs[i], rhs, mpq_mul)
  3. 使用未声明的标识符“Rcpp”:Rcpp::Range r(0, n_xb-1)
  4. 使用未声明的标识符“r”:bigrationalR::create_bigrational(xab[r],...

即,1 和 2 出现是因为我将lhsrhs视为 s 的向量bigrational;出现 3 和 4 是因为我使用了一个仅由Rcpp识别但未包含在文件中的对象。

如何解决这两个广泛的问题?对于 1 和 2,我不明白add.bigq(它调用bigrational_add,一个接受两个bigrationals 的函数)如何接受两个向量,但不知何故,像上面这样的卷积函数不像那样“灵活”。对于 3 和 4,有没有可以相对简单地调用的stdlib替代方法Rcpp::Range,还是我必须创建自己的对象类型?

再次感谢!

0 投票
0 回答
29 浏览

c++ - 四元数的 Boost.QVMs 'normalized()' 不适用于 Boost.Multiprecision

我正在使用 Boost.QVM 并boost::multiprecision::cpp_dec_float_50作为我的四元数的标量。

我尝试了我的程序double而不是boost::multiprecision::cpp_dec_float_50它并且它有效,所以我相信这是问题的原因。

我得到的错误是:

0 投票
2 回答
30 浏览

c++ - QVM - 用户定义的四元数和标量

我正在尝试boost::qvmboost::multiprecision. 我构建了一个用户定义的四元数,但我无法缩放四元数。我想按多种类型对其进行缩放boost::multiprecision::cpp_dec_float_100。贝娄是我的代码。我还用注释掉的代码尝试了它。

我得到的错误是:

0 投票
2 回答
34 浏览

c++ - Boost.Multiprecision cpp_dec_float_50 - 转换成字节数组并返回?

类似的问题:Boost.Multiprecision cpp_int - 转换成字节数组?

但这一次与浮点值有关。

  1. export_bits - 似乎没有接受浮点值的重载
  2. cpp_dec_float_50 的肢体不对外公开

问题: 因此,应该如何解决将这种数据类型与字节数组相互转换的问题?

0 投票
1 回答
20 浏览

c++ - 将 boost::multiprecision::int256_t 转换为字符串

例如,如果我有,我将如何将 boost::multiprecision::int256_t 类型变量转换为字符串