c++ - 使用 mpfr 数组的替代方法

标签 c++ arrays bignum

我正在尝试使用 MPFR 在 C++ 中编写一个函数来计算多个值。我目前正在使用 mpfr 数组来存储这些值。不知道每次需要计算和存储多少个值。这是函数:

void Calculator(mpfr_t x, int v, mpfr_t *Values, int numOfTerms, int mpfr_bits) {
    for (int i = 0; i < numOfTerms; i++) {
        mpfr_init2(Values[i], mpfr_bits);
        mpfr_set(Values[i], x, GMP_RNDN);
        mpfr_div_si(Values[i], Values[i], pow(-1,i+1)*(i+1)*pow(v,i+1), GMP_RNDN);
    }
}

程序本身有一个 while 循环,它有一个嵌套的 for 循环,它接受这些值并用它们进行计算。这样,我就不必在 for 循环中每次都重新计算这些值。当 for 循环完成后,我用

清除内存
delete[] Values;

在 while 循环再次开始之前,在这种情况下,它重新声明数组

mpfr_t *Values;
Values = new mpfr_t[numOfTerms];

需要存储的值的数量由不同的函数计算,并通过变量 numOfTerms 告知该函数。问题是由于某种原因,数组极大地减慢了程序的速度。我正在处理非常大的数字,所以我的想法是,如果我每次都重新计算这些值,它会变得非常昂贵,但这种方法比在 for 循环的每次迭代中重新计算值要慢得多。有替代方法吗?

编辑** 我没有每次都重新声明数组,而是将声明和 delete[] 值移到了 while 循环之外。现在我只是用

清除数组的每个元素
for (int i = 0; i < numOfTerms; i++) {
            mpfr_clear(Values[i]);
}

while 循环重新开始之前的 while 循环内部。该程序的速度明显加快,但仍然比仅计算每个值要慢得多。

最佳答案

如果我没理解错的话,你是在 while 循环中做的:mpfr_init2(在迭代开始时)和 mpfr_clear(在迭代结束)在 numOfTerms MPFR 数上,numOfTerms 的值取决于迭代。这是花费大部分时间的事情。

为了避免由 mpfr_init2 进行的这么多内存分配和由 mpfr_clear 进行的释放,我建议您在 while 循环之外声明数组,并且最初在 while 循环外调用 mpfr_init2。数组的长度(即项数)应该是您认为的最大项数。可能发生的情况是,对于某些迭代,选择的项数太少。在这种情况下,您需要增加数组的长度(这需要重新分配)并对新元素调用 mpfr_init2。这将是剩余迭代的数组的新长度,直到数组需要再次扩大。在 while 循环之后,执行 mpfr_clear

当你需要扩大数组时,有一个很好的策略来选择新的元素数量。仅获取当前迭代所需的 numOfTerms 值可能不是一个好方法,因为它可能会产生许多重新分配。例如,确保您至少有 N% 的增长。做一些测试来选择 N 的最佳值...参见 Dynamic array例如。特别是,您可能想要使用动态数组的 C++ 实现,如这篇维基百科文章所述。

关于c++ - 使用 mpfr 数组的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28385736/

相关文章:

language-agnostic - 大数类的最有效实现

embedded - 寻找嵌入式 C 库来操作不使用标准 libc 的大数?

c++ - GMP 如何在任意数量的字节上存储它的整数?

c++ - 避免循环依赖——需要相互牵制

c++ - 了解导致此多重定义错误的原因

java - 旋转二维数组 - 一个工作示例和一个损坏的示例(为什么?)

c++ - 初始化两个二维数组并用 0 填充其中一个数组的第一列和第一行以及动态内存分配

c++ - 自定义堆栈分配器,覆盖删除

c++ - 在计算所有可能路径问题时计算 nCr

c++ - 使用 lib Rapidjson 将混合 JSON 数字数组转换为 int、uint、float