簡體   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