2015-02-07 78 views
1

我想用C++编写一个函数,使用MPFR来计算多个值。我目前使用mpfr数组来存储这些值。不知道每次需要计算和存储多少个值。这里是功能:替代使用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循环在这种情况下,再次启动之前,redeclares与

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

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

编辑**而不是每次重新声明数组,我移动了while循环之外的声明和delete []值。现在我只是清除阵列中的每个元素

for (int i = 0; i < numOfTerms; i++) { 
      mpfr_clear(Values[i]); 
} 

在while循环之前的while循环重新开始。该程序的速度显着提高,但仍然比仅计算每个值慢得多。

+1

pow(-1,i + 1)看起来像是改变符号的昂贵方式。 – 2015-04-10 00:53:41

回答

2

如果我理解正确,你正在做一个while循环中:mpfr_init2(在迭代的开始)和mpfr_clear(在迭代结束)上numOfTerms MPFR号码,并numOfTerms值取决于迭代。这是大部分时间需要的。

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

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

+0

我曾经在这里问过类似于C++中的向量来与mpfr一起使用,但我不认为存在。 – 2015-02-08 01:31:05

+0

@A。Wong C++向量是C中不存在的C++概念(其中动态数组必须由最终用户实现)。因此,不可能将它们放在只提供C接口的MPFR库中。 – vinc17 2015-02-08 02:30:10

+0

嗯。我想我应该教自己如何实现动态数组。谢谢! – 2015-02-08 07:05:49