问题标签 [arbitrary-precision]

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 投票
3 回答
976 浏览

java - BigDecimal 精度爆炸

我正在尝试以大于双精度的固定精度在 Scala(和/或 Java)中进行计算。我将 BigDecimals 与 Scala 的默认MathContext一起使用,其精度为 34。即使所有输入都具有此精度,但我发现经过几次计算后,结果的精度开始爆炸式增长。

这是一个我认为可以说明问题的示例计算:

结果为 81,精度高于z40. 就我而言,我从不使用 setScale,但在计算中会出现比例非常大的零。

这不是我想要的行为。我想要(1 + z40*z40)精度 34 - 执行计算的 MathContext 的精度(因为z40*z40与 1 相比小得可以忽略不计)。我怎样才能得到这种算术?

更新:此行为是由于Scala 2.9.* 和 2.10.* 之间的 MathContexts 处理发生了变化。(感谢 Paul Phillips 指出提交。)另请参阅此讨论

0 投票
1 回答
2449 浏览

c++ - 计算 pi 的位数

我使用 GMP 库和 C++ 编写了 Gauss-Legendre 算法的实现来计算 pi 的位数。

它有正确的输出,但问题是我不知道输出在什么时候“变坏”,因为我必须在代码中指定精度。

这是使用 64 位精度的输出:3.141592653589793238* 35 *,最后两位数不正确。

我的问题是,如果我想要n位的 pi,需要多少位精度b以及算法i需要多少次迭代?

谢谢你

0 投票
5 回答
4422 浏览

r - 针对某些初始值产生 NaN 的函数的优化

我想找到以下目标函数的所有局部最小值

'func' 是 Logistic 回归模型的 Fisher 信息矩阵的行列式,是参数 b1 和 b2 的函数,其中 b1 属于 [-.3, .3],b2 属于 [6, 8]

假设 b = c(b1, b2) 的这两个初始值

具有初始值的局部最小值in1为:

从优化过程中发生的终止中可以看出,$massage最小值无法计算并作为局部最优值optim返回 。in1

对于“in2”,也会出现错误:

发生此错误是因为 NaN` 的funcin2' is

然而,对于in1目标函数的值,in1计算但优化终止,因为optim无法继续计算另一个初始值:

让我定义没有 det 的 func ,就像矩阵一样,看看发生了什么:

我们得到

Mat.func(in2)因此,通过双精度,元素的值为Inf. 我还Mat.func用 mpfr 函数重写:

因此:

因此,精度为 55,矩阵元素的值Inf不再存在。不幸的是, mpfr函数改变了目标的类别,也det没有 r 优化函数不能应用,为了澄清,我提供了两个例子:

因此,使用 mpfr 无法解决问题。

为了找到所有的局部最小值,应该编写一个应用不同随机初始值的算法。但是可以看出,对于函数产生的一些初始值NaN (忽略这些值不是一个好主意,因为它通常可能导致丢失一些局部最小值,特别是对于具有大量局部最优值的函数)。

我想知道是否有任何 R 包可以进行任意精度的优化过程以避免NaN目标函数?

谢谢

0 投票
1 回答
1070 浏览

c - 用于任意精度算术的 GCD 算法

我完全被这个问题所困扰,所以我正在寻求任何帮助。

我想每个人都知道基本的 GCD 计算算法,比如二进制或欧几里得 GCD。实现这样的方法来计算两个单精度数是没有问题的。实际上,这只是大约几笔。

我需要为多精度数字(超过 10^5 位)实现此方法(用 C 语言)。有几个可用的 GNU 库(GNU MP、MPFR、MPIR),它们可以定义多精度数字并对它们进行操作。它看起来像一个多精度数字存储在内存中,作为一对单精度部分,也就是“肢体”。

实现了一些方法来查找 gcd(a, b),但实际上它们很难满足我的需要。仅当 a 和 b 正好包含两个肢体时才使用 GCD 计算的二进制方法。当 min(a,b) 包含多于(即 630 个)肢体等时使用的 HGCD 方法。我发现很难弄清楚,如何扩展这些方法中的任何一个以用于任何长度的 a 和 b。我还发现不同版本的 GNU 库包含不同版本和方法的 GCD 算法。

问题:我想知道是否有可能使二进制 GCD 算法与“肢体”方面的任何长度的多精度整数一起工作,如果可能的话 - 获得任何帮助或想法如何在 C 中实现它。有没有人有任何想法或代码部分如何实现它?

我想考虑任何建议或任何其他解决方案来解决该问题。

如果有人愿意看一下,这是(a = b = 2 个肢体)的 GNU MP 二进制 GCD 方法的一部分:

以上代码粘贴

0 投票
2 回答
1753 浏览

fortran - 如何计算任意高精度的数字?

我写了一个简单的fortran程序来计算高斯常数:

4 次迭代后的结果为 0.83462684167407308。无论如何使用算术几何平均方法获得更好的结果?人们如何计算诸如 pi、欧拉常数等数字的多位数字?每个无理数都有特定的算法吗?

0 投票
1 回答
1117 浏览

c - 让 GCC 在没有内联汇编的情况下使用进位逻辑进行任意精度算术运算?

在使用任意精度算术(例如 512 位整数)时,有没有办法让 GCC 使用 ADC 和类似指令而不使用内联汇编?

对 GMP 的源代码的第一印象表明,他们只是为每个受支持的平台提供了汇编实现。

这是我编写的测试代码,它从命令行添加两个 128 位数字并打印结果。(受 mini-gmp 的 add_n 启发):

GCC -O3 -std=c99不产生任何adc指令,由objdump. 我的 gcc 版本是i686-pc-mingw32-gcc (GCC) 4.5.2.

0 投票
1 回答
3947 浏览

c++ - 如何在 C++ 中从头开始实现 bignum 加法/乘法

我已经开始编写一个 bignum 库,其中包含一个短裤向量来表示值、一个打印函数和负数支持。但是,我找不到实现长加法的好方法,如下所示:

我拥有的没有给出段错误的最新代码是这样的:

,但带进位的加法不正确(10+1 是 21)

编辑:它被实现为一个类

0 投票
1 回答
189 浏览

c++ - 将小数取整数次方时保持准确性

我的代码如下(为了阅读方便,我做了简化,功能不足见谅):

每次我运行 t>200 的代码时,能量输出都会失去准确性(因为它被提高到高功率),我被告知我需要使用任意精度整数并获取 GMP 库。我已经做到了这一点,并设法让代码在我的范围内与 GMP 库一起运行,但我并没有真正得到我应该改变的东西。

我是否要更改 t 或能量(和能量)或距离或所有三个(/四个)?我真的不明白我应该改变什么,但我现在正在阅读如何从手册中做到这一点。

注意:我最初的问题是在这里,但我认为确实已经回答了,这需要一个新的问题。当这确实有效时,我将在那里接受答案:Losing accuracy for large integers (pow?)

我已经更改了我的代码(如下所示),但我只是在初始化 En[b] 后立即提出分段错误 11。如果评论能更深入地说明我要做什么,我将不胜感激。感谢到目前为止的所有帮助,A.

0 投票
1 回答
870 浏览

matlab - Matlab:计算中的精度损失。可以缩放变量吗?

今天我在 Matlab 中遇到了一个精度问题:

在哪里

一个=

g =

bB =

标准差 =

你=

ķ =

显然,由于不同维度的变量的计算,我遇到了计算机精度的问题:

TP =

不幸的是,我真的不知道如何处理这个问题。我玩弄了输出格式,但这不是问题。所以我认为它确实是内部计算精度让我受益。但是,如果我自己计算 sqrt(K).*u 或 u.*Sd,我会得到合理的值。只有当我将所有 3 个矩阵相乘时,我才会得到相同的值,尽管它应该会有所不同。我找到了这个线程,但我的情况略有不同,因为我没有得到任意值,但由于某种原因它们都是相同的: 计算互补投影时的数值问题

我还认为像这样缩放所有变量:Sd = Sd/max(Sd) 可能会有所帮助,但由于我需要一个非常准确且尺寸正确的结果,所以这无济于事。

即使在使用

我每次都得到相同的值,但数字更多。为什么是这样?

我希望你能帮助我。干杯

编辑:这里有更多代码可以更好地理解我的问题:

0 投票
1 回答
562 浏览

c - 用于简单固定(多)精度操作(add、div、mul、sub)的快速 C 代码?

我一直在编写一些 cython 代码来实现我想在 python 中使用的多精度数组运算(主要是点积和矩阵求逆)。我使用 mpfr 作为底层 C 库,通过在 C 和 Cython 中进行测试,我发现 mpfr(以 200 位精度)比 numpy(以机器精度)慢 50-200 倍(取决于操作)。我知道 mpfr 非常快,但我仍然发现这个开销非常大。由于我的需求非常有限(固定精度,只有基本操作,如加法、乘法等。)我想知道我是否可以手动编写一些多精度操作(不考虑仔细舍入等)。不幸的是,这涉及很多工作,所以我希望在 C 或英特尔汇编中找到一些免费的代码片段,用于进行基本的多精度算术。

更新:我应该提到我已经尝试过 QD 库,它实际上(稍微)慢于类似精度(212 位)的 MPFR。我想这一定是由于 C++ 开销。