问题标签 [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 回答
841 浏览

c++ - 使用 boost multiprecision/mpfr float - 字符串不能被解释为有效的整数错误

我编写了一个程序,它执行一些非常大的简单算术运算。我成功地使用了 boost 多精度库中的 mpz_int 和 mpf_float,但发现我需要更高的精度来实现我的目的。我一直在尝试使用 mpfr 库来定义更精确的浮点数。我能够编译我的代码,但现在收到运行时错误 libc++abi.dylib: terminating with uncaught exception of type boost::exception_detail::clone_impl >: The string “1572…[4000 digits]…00.328” can不被解释为一个有效的整数。

我有一种感觉,这是我尝试将我创建的 mpfr_float 转换为导致问题的整数。我从一个整数字符串初始化浮点数,并在尝试向下舍入并转换为整数之前进行一些除法。这是我的类型定义:

我的声明:

和我尝试的转换:

如果有人可以帮助我完成此转换并避免运行时错误,我将不胜感激。我认为尽管我的困惑的根源可能比这更深,所以我想解释一下我的项目,看看是否有人能告诉我,我正在做的事情是否从根本上是错误的。

我正在尝试创建看起来随机但由可预测的伪随机函数构成的文本页面。因此,如果有人输入 1,然后是 2,然后是 3,他们会注意到三页文本之间没有任何模式,但是输入任何这些数字每次都会给出相同的文本。我正在尝试创建 29 个字符的页面的所有可能性 3200 次,或 29^3200 个可能性(大约 10^4680)。

我正在使用暂停序列来生成伪随机质量,并将结果乘以 29^3200。

这是我的暂停序列:

然后,我从结果数字到 base-29 进行基本转换,以获得一页文本。最初我将 mpz_int 用于 29^3200(从字符串初始化) - 但我发现这会产生重复模式。取决于halton序列的分母是什么。例如,产生分母 243 的输入将产生一页文本,其中相同的 162 个字符从 3200 个字符重复,只是在不同的位置。

这是我的程序的基本转换部分:

我对数学的理解不够好,无法理解为什么会发生这种重复,但凭直觉我改成了浮点数。我发现这样做要好得多 - 模式要短得多,并且只会开始出现在输出字符串的开头(代表更高的值),但最终它们仍然存在并且可以识别。我发现 mpf_float 比 mpf_float_1000 工作得更好,而且在产生更多看似随机的结果方面,它们都比 mpz_int 好得多。

正如我之前提到的,我的表面问题很简单:我如何避免这个运行时错误?但我更关心的是:a)为什么会出现这些模式?我是否正确,精度更高的浮点数会消除这些重复的字符串?b) 如果是这样,mpfr_float 是最好的数据类型吗?我应该给它什么程度的精确度?c) 如果不是,我应该使用什么数据类型?

我非常感谢任何可以回答这些问题的人。

- -编辑 - -

我解决了我遇到的问题,方法是坚持使用 mpf_float,使用 29^3280 作为种子,并切断最后 80 个重复的字符。不过,我仍然对固定精度和可变精度感到好奇。当我试图用更高的模板参数定义一个固定精度的 gmp_float 时,我得到了更糟糕的结果。究竟什么是固定精度和可变精度,为什么会产生这样的结果?

0 投票
1 回答
715 浏览

c++ - 具有 boost::multiprecision::mpfr_float 的 Eigen3 动态矩阵

我想制作矩阵并使用 Eigen3 库使用它们,我的数字类型是 Boost.Multiprecision 的 mpfr_float 包装器。我可以使矩阵很好,但是除了矩阵加法之外,我尝试过的所有操作都失败了。仅仅将两个单位矩阵相乘就会产生垃圾结果!

这是一个MWE:

它可以很好地生成单位矩阵,但是在我的机器上,使用此代码的依赖项的最新自制分发版本(和其他版本)(Boost 1.57,Eigen 3.2.4),我的程序在矩阵中每隔一行生成 NaN :

奇数矩阵大小在底部产生两行 nan...

这似乎不依赖于默认精度,或者NumTraits我定义的结构的细节,甚至我是否定义了一个。我可以继承GenericTraits<mpfr_float>,也可以不继承;我可以说RequireInitialization = 1,或者0。我得到了NaN。如果我尝试通过 LU 反转来求解系统,则返回的矩阵完全是 NaN。如果矩阵的大小是 1x1,我什至可以从矩阵乘法中得到一个 NaN。更改各种静态函数也没有影响。

我觉得最奇怪的部分是,如果我定义一个自定义复杂类(不是 std::complex,出于数据丢失的原因),使用 mpfr_float 作为实部和虚部的基础类型,我确实得到了函数矩阵。

编辑:这是复杂类型的 NumTraits:

这是我写的复杂类:

我究竟做错了什么?我可以对 Eigen / NumTraits / 等做些什么来让矩阵运算正常工作?

0 投票
1 回答
467 浏览

python - 如何在 Numpy 矩阵运算中保持 gmpy2 mpfr 的精度

我在 Numpy 矩阵中使用多精度 Rationals(mpfr) 对象,

但是当计算矩阵的逆时,我会失去精度。

那么如何保持mpfr的精度呢?任何建议将不胜感激!

0 投票
2 回答
868 浏览

c++ - 使用 Boost.Random 从种子生成多精度整数

我正在尝试使用 C++ 的 Boost 多精度库来生成大随机数。我无法创建一个按时间或另一个随机数播种的生成器,因此我的生成器在每次运行时都会产生相同的数字。如何使用不断变化的值为生成器播种以在每次运行时产生不同的值?这是有效但在每次运行时产生相同值的代码:

我之前成功播种了 std mersenne twister:

但我不确定如何播种多精度 mt。如果我尝试将任何参数附加到 generator_type 声明,我会收到错误消息。

0 投票
1 回答
956 浏览

c++ - 将 boost::multiprecision 数据类型写入二进制文件

我使用该boost::multiprecision::uint128_t类型是为了对 128 位值执行按位运算。但是,我无法将 128 位值写入二进制文件。特别是需要用零填充值。

例如,如果该uint128_t0x123456在十六进制编辑器中查看文件,我将需要以下序列:

56 34 12 00 00 00 00 00 00 00 00 00 00 00 00 00

相反,二进制文件以一个值结束:

56 34 12 00 CC CC CC CC CC CC CC CC CC CC CC

我可以看到uint128_t模板的 boost 后端似乎将 128 位存储为四个 32 位值。并且有一个“肢体”值,它指示有多少个 32 位值正在使用中。当 32 位值不使用时,它们会用0xCCCCCCCC. 所以ofstream.write是遍历字符数组并写出0xC's。

我在 boost 库中是否缺少一些东西来帮助正确地写出来,或者我需要将uint128_t值转换为另一种数据类型?

0 投票
2 回答
605 浏览

c++ - 使用带三角函数的 boost 多精度

考虑下面的代码,它使用 boost 创建了一个多精度浮点数“ a ”。

如何使用 boost 库来调用三角函数?例如,我希望计算sin(a)

0 投票
1 回答
147 浏览

boost - 在哪里可以找到与 boost::rational 配合使用的(C++ 特定的)无限整数类?

我想使用有理数,其分子和分母可以远远超过 long long int 的限制,而 boost::rational 是一个很好的类,专为无限整数类型而设计。但是当我查看 C++ 存在哪些无限整数类型时,唯一推荐的是 GMP,它是为 C 设计的,因此需要处理烦人的内存管理问题。是否存在包含无限整数类型的 C++(不是 C)库,可以很好地与 boost::rational 配合使用?

0 投票
1 回答
580 浏览

c++ - 为什么我既不能使用 std::unordered_map 也不能使用 boost::unordered_map 和 boost::multiprecision 类型?

我正在尝试使用例如类型创建一个STL(或boostunordered_map,但在尝试将元素插入此容器后抛出错误。boost::mulprecisioncpp_intgcc

完整的错误日志在这里

第一个错误:

关于的多精度类型, STL/boost容器的使用是否有限制?boost我正在使用提升 1.54。

编辑

这可能是重复使用的问题boost::multiprecision是在 boost 1.56 中添加的序列化支持(至少根据文档@1.55@1.56的差异。

此外,在那个问题中,没有提到在没有序列化支持的情况下解决此问题的其他方法boost::multiprecision

0 投票
2 回答
707 浏览

c++ - 具有大致相同大小的操作数的大整数除法

我正在尝试实现一个函数来计算两个大小大致相同的数字之间的除法。我使用 's 的数组unsigned int来存储每个数字的值(参见下面的类结构)。unsigned int我想为两者的数量之差不大于1的情况实现一个有效的除法函数。我研究了长除法算法(如维基百科中所述),但它太慢了。有没有处理这种特殊情况的有效算法?目前,我正在处理最多 100 位数字的数字。

谢谢

0 投票
1 回答
931 浏览

c++ - cpp_dec_float_50 的精度是多少?

查看名称和Boost Multiprecision 文档,我希望cpp_dec_float_50数据类型的精度为 50 位十进制数字:

使用 typedef cpp_dec_float_50 隐藏了多精度的复杂性,允许我们定义具有 50 位精度的变量,就像内置的 double 一样。

(虽然我不明白与 double 的比较——我的意思是double通常实现二进制浮点运算,而不是十进制浮点运算。)

这也与以下代码的输出相匹配(双精度部分除外,但这是预期的):

但是为什么下面的代码会打印 74 位数字呢?

成员函数按预期工作,str()例如

只打印 50 位数字 -它被记录为

返回格式化为字符串的数字,至少包含精度数字,如果科学为真,则返回科学格式。