gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:56:38 27 4
gpt4 key购买 nike

我正在尝试使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com