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

c++ - 使用提升多精度的数学精度问题

我正在将一个 bash 脚本转换为一个名为 Galaxy Calculator 的 Qt Qml Felgo 应用程序,我需要计算 Galaxy 的周长,浮点数在计算中失败了 100 英里,使用 C++ 的 JavaScript,这些数字在很长一段时间内都很大双倍的。这是 bash 行

我解释这个是为了让你理解这个数字,我不想争论数学,它是物理学博士的一部分,描述了这个数学,但你可以检查这个数字的任何估计结果,但它不是我的问题的一部分,只是试图解释我正在做的计算类型需要如此高的准确性。在 Galaxy 中计算距离时,它将是一个很大的数字,我需要帮助的是通过将两个数字相乘获得正确的输出,这是我的函数:

只看代码大多数程序员就会注意到我的第一个错误: toFloat() 我传入字符串并返回一个字符串以避免使用浮点数,但我找不到另一种填充这种数据类型的方法,因为我没有想法如何传递一个字符串,我已经找了两天的例子,所以这是我的第一个问题,这可能导致我的第二个问题,这是我得到这个的返回值:

1011954108252979200.000000

当我预料到这一点时(bc 很棒:接受一个字符串,然后将其返回);

1011954093357316199.9999999999118107708

也许我有点挑剔,数字很接近,但那些多余的数字是以英里、英尺和英寸为单位的,这只是一个等式,这个错误会越多越累,这只是一个例子,有些计算比其他计算有更多的数学,所以我需要帮助来弄清楚如何传递一个字符串,以及如何返回一个具有该函数可以给我的所有准确度的字符串,我可以稍后将它舍入,一些我需要用于其他计算,所以我不希望它们超过 16,因为在那之后我们谈论的是一英寸的分数,我不需要那么高的精度,但我确实需要分数英里,英尺到最后一英寸。

我确实尝试过 mpfr_float,其他人也喜欢它,所以我想知道是不是我必须将它转换为一个浮点数,从而搞砸了它;所以我真的需要能够用字符串填充这个值,所以我不会失去任何精度。

我对该函数的输入在 bash 脚本中,我必须这样做 3 次才能得到答案,而且我不介意,过度使用 eval 来运行它,并且 PI 固定在那么多数字上,因为这就是我的堂兄多次删除了他所有计算中使用的艾萨克牛顿,所以我不能使用 PI。我可以使用任何有效的数据类型,如果您知道显示如何执行此操作的文档,请包含它们,boost 的链接很可能是我已经阅读过的链接,自从它首次出现以来一直是 boost 用户,我第一次使用这个库,但是他们所有的例子都是一样的,他们的文档非常临床,不是很糟糕,你知道我的意思,它读起来就像是电脑写的,并用一页作为模板下一个,所以一段时间后,所有文档看起来都一样,我握了很长时间,

提升:https ://www.boost.org/doc/libs/1_68_0/libs/multiprecision/doc/html/index.html

0 投票
0 回答
173 浏览

boost - 无法以编程方式更改提升多精度 mpfr 精度

请记住,Precision 是基于总位数而不是小数位数,但我需要一种设置小数位数的方法,而我只能找到 Precision,所以我正在尝试使用它,所以我考虑了整数中的位数,以使其正常工作,但这不起作用。

我想做一些数学运算并返回一个设定的精度值,该函数采用一个非常大的数字字符串,具有非常大的小数精度,并将其作为一个字符串返回,该字符串设置为作为精度传入的小数位数:

我试过没有typedef,同样的问题;

MathWizard::multiply("123456789.123456789", "123456789.123456789", 20);

Precision 18位,9+9,我要30

将返回 22 位小数

15241578780673678.51562

而不是 20

15241578780673678.516

那么为什么它关闭了2?

我想在数学之后进行精度更改,但似乎你必须先设置它,而不是像 boost 在他们的示例中显示的示例,但仍然没有返回正确的值,这样做之后不会改变值.

更新:将我所做的与他们在这篇文章中所说的进行比较: 如何使用 boost::multiprecision 在运行时更改数字精度

我注意到 gmp_float、mpf_float(使用 boost/multiprecision/gmp.hpp)和 mpfr_float 之间的差异,而 mpfr_float 会给我更接近的精度,例如,如果我取数字(1/137):

只有 1 精度,我希望我的答案少一位小数。

其他数据类型也类似,我都试过了,所以这段代码对这里描述的所有数据类型都一样:

boost 1.69.0:多精度第 1 章

我还必须指出,我依赖 Qt,因为此函数用于 QtQuick Qml Felgo 应用程序,实际上我无法将其转换为字符串而不将其转换为指数,即使我使用了 ans.str()对于两者,我的猜测是 fromStdString 与 std::string(ans.str()) 做的事情不同。

我想如果我不能弄清楚他,我会做字符串舍入以获得正确的精度。

如果不使用 QString,我仍然无法逃脱,但这不起作用,它返回 16 位而不是 13 位,我知道这是一个不同的问题,因此我只是发布它以表明我的替代方案此时不能更好地工作. 另请注意,除法函数的工作原理与乘法相同,我使用该示例来显示数学与此无关,但他们向我展示的所有示例似乎都无法正常工作,我不明白为什么,所以只是为了使步骤清晰:

  1. 创建后端:typedef boost::multiprecision::number > my_mpfr_float;
  2. 设置精度:my_mpfr_float::default_precision(precision);
  3. 设置变量的初始值:my_mpfr_float aThis(mThis.toStdString());
  4. 如果您愿意,可以做一些数学运算,以正确的精度返回值。

我肯定错过了什么。

我知道我可以得到字符串的长度,如果比 Precision 长,则检查 Precision + 1 是否大于 5,如果是,则在 Precision 上加 1 并返回 0 的子字符串,Precision 并完成所有这些正确做事的方式,我什至可以在返回后在 JavaScript 中执行此操作,而忘记以正确的方式执行此操作,但我仍然认为我只是遗漏了一些东西,因为我无法相信这实际上是应该的方式工作。

提交的错误报告:https ://github.com/boostorg/multiprecision/issues/127

0 投票
0 回答
135 浏览

c++ - cpp_int (boost) 运行时错误:解析字符串时发现意外内容

我在 boost::multiprecision::cpp_int 中遇到以下运行时错误:

函数 randomCppInt 生成一个指定长度的随机 cpp_int。程序只是循环显示这些,但随机终止并出现错误 - 有时在第一次通过循环时,有时在几次迭代后。我似乎无法确定我哪里出错了。

0 投票
1 回答
138 浏览

c++ - boost::multiprecision::gmp_float::operator= 中的神秘堆栈溢出异常?

我正在尝试使用Ramanujan 的公式计算我的一个大学项目的 pi,用于浮点后的任意位数。对于这项工作,我使用的boost::multiprecision库只是我已经安装在我的机器上的 mpfr 和 mpir 的包装器。

到目前为止一切都很好,但是我要么遗漏了什么,要么做错了什么,因为我的计算函数(计算公式中总和的每次迭代的函数)不时抛出StackOverflow exception。(当它开始时它是一致的)

这是它的样子

我承认我对整个任意精度计算/转换和库太陌生了,所以我可能会遗漏一些东西。

我无法向您展示完整的调用堆栈,因为它太长了,但是之后

然后有3603个后续调用

只是导致后来很少调用stackoverflow异常

听起来很有趣,但我不记得calculatePi在“工作”之前更改功能。

你们能帮我破译发生了什么,因为我似乎迷路了吗?

我的默认精度boost::multiprecision::mpf_float是浮点数之后的 150 位数字,这以前不是问题(我记得我计算了一些具有 10 000 浮点精度的数字,而不是 SO 或其他)


要求

1.我的阶乘代码

0 投票
1 回答
90 浏览

c++ - 我应该如何使用 mpfr::mpfr_fac_ui 函数?

我试图找到一个如何mpfr::mpfr_fac_ui通过互联网使用的例子,但我无法做到,所以我决定在这里问。

我有自己的迭代阶乘

但我想尝试内置factorial

我不知道我做错了什么,因为当我像这样测试它时

mpfr_fac_ui不返回任何错误(返回 0)并且test是 0 而它应该是 120。

我做错了什么还是我错过了什么?

0 投票
1 回答
1130 浏览

c++ - boost-multiprecision cpp_int 的最高限制是多少?

我正在努力分解大的半素数。我正在研究 Java,但我也很想探索其他选项。我知道 C++ Boost 多精度支持大数。

我从 Boost 页面中找到了以下信息:

我的问题是,cpp_int 类型的最大数量限制是多少?在 Java 中,BigInteger 最多支持 2^Integer.MAX_VALUE。

谢谢你。

0 投票
0 回答
271 浏览

c++ - 如何解决 boost::multiprecision::cpp_dec_float 除法错误

除法boost::multiprecision::cpp_dec_float有某种舍入误差,如下:

输出:

这是预期的吗?

考虑到真的需要十进制值,还有其他更合适的类型吗?

我是否应该截断或舍入到神奇的十进制数字?

0 投票
1 回答
125 浏览

c++ - 将 RFC5114 中定义的 1024bit P 和 G 值加载到 boost uint1024

我正在尝试实现一个 diffie-hellman 密钥交换系统。对于我的 P 和 G 值,我计划使用RFC5114 2.1中定义的值。所以我有以下代码:

#代码

#输出

#Warning 警告:整数常量对于它的类型来说太大了

所以... ###我在这里做错了什么?我该如何解决这个问题?

0 投票
0 回答
123 浏览

c++ - 如何执行 boost::cpp_dec_float_50 和 boost::int1024_t 数据类型的取模?

我正在尝试对两个数字执行模运算。一个是cpp_dec_float_50类型(十进制)数字,另一个是int1024_t类型数字 - 两者都由 Boost Multiprecision C++ 库提供。

我尝试过使用%运算符和标准库的fmod()函数,但可惜它们不是为此类数据类型设计的。我已经浏览了 Boost 文档,但是没有任何可以使用其自己的浮点数据类型的模块化替代方案的踪迹。

请注意,该int1024_t非常大。

必须有某种方法可以对这些值执行模运算,希望有人可以为我解释一下。

干杯。

0 投票
1 回答
395 浏览

c++ - 如何将 boost 多精度整数从小端转换为大端?

我正在尝试修复废弃软件程序的这一部分,因为我找不到替代程序

如您所见,PUSH 指令的数据顺序错误,而以太坊是大端机器(地址正确表示,因为它们使用较小的类型)。
另一种方法是运行porosity.exe --code '0x61004b60026319e44e32' --disassm

u256类型定义为

这是重现该错误的最小示例

因此,数字被转换为字符串,每个字节之间有一个空格(并且只有第一个字节)。

但后来我遇到了字节顺序问题:字节以相反的顺序打印。我的意思是,例如,317228a 02 02在我的机器上编写的,并且02 02 8a在为大端目标编译时。

所以我没有调用哪个 boost 函数,我修改了代码

现在,为什么我的 256 位整数大多打印为系列00 00 00 00 00