繁体   English   中英

替代使用mpfr数组

[英]Alternative to using mpfr arrays

我正在尝试使用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_init2避免释放mpfr_clear ,我建议您在while循环外声明该数组while并首先在while循环外调用mpfr_init2 数组的长度(即项数)应为您认为的最大项数。 可能发生的情况是,对于某些迭代,选择的项数太少。 在这种情况下,您需要增加数组的长度(这将需要重新分配),并在新元素上调用mpfr_init2 这将是剩余迭代的新数组长度,直到需要再次扩大数组为止。 while循环之后,执行mpfr_clear

当需要扩大数组时,有一个很好的策略来选择新的元素数量。 仅取当前迭代所需的numOfTerms值可能不是一个好方法,因为它可能会产生许多重新分配。 例如,请确保您至少增加了N%。 做一些测试以选择N的最佳值。例如,请参阅动态数组 特别是,您可能要使用Wikipedia文章上提到的动态数组的C ++实现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM