替代使用mpfr数组

时间:2015-02-07 18:23:52

标签: 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循环内部

。该程序明显更快,但仍比计算每个值的速度慢得多。

1 个答案:

答案 0 :(得分:2)

如果我理解正确,你在while循环中进行:mpfr_init2(在迭代开始时)和mpfr_clear(在迭代结束时)numOfTerms 1}} MPFR编号和numOfTerms的值取决于迭代。这就是大部分时间。

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

当你需要放大阵列时,有一个很好的策略来选择新的元素数量。仅为当前迭代获取所需的{{1}}值可能不是一个好的,因为它可能会产生许多重新分配。例如,确保您至少增加了N%。做一些测试以选择N的最佳值...例如,请参见Dynamic array。特别是,您可能希望使用动态数组的C ++实现,如本维基百科文章中所述。