2012-10-09 87 views
3

我需要顯示整數平均運算結果的前100位數字。整數的系列被存儲在mpz_t類型的陣列,那麼它求和以mpq_t併除以另一個mpq_t(計數)GMP-除法精度或打印問題

代碼:

mpq_t sum; 
mpq_init(sum); 
//same for variable count, they are filled from mpz_t 

//display for check 
gmp_printf("%.Qd\n", sum); <- here everything correct 
gmp_printf("%.Qd\n", count); <- here also 

mpq_div(sum, sum, count); 

//to display with floating point 
mpf_t avg; 
mpf_init(avg); 
mpf_set_q(avg, sum); 

gmp_printf("%.100Ff\n", avg);  

在最後一行的顯示,比方說對於總和= 2, count = 3是錯誤的。這是後約10-15位ceiled和充滿0。(2/3)這是0.66666666670000 ......

所以兩兩件事:

  1. 我不想樓/小區吧,後100位數字只需截斷
  2. 填充所有100位有意義的數字

所以對於(2/3)所需的輸出是:

0.666 ... 666(以百6,也與6結束)

回答

4

使用mpf_init2(avg,prec),其中prec是期望的最小位精度。請注意,在幕後,GMP通常以32位或64位組的形式工作,因此計算的實際精度至少是您要求的精度。

防止輸出四捨五入更加困難。我會建議使用MPFR庫。它是一個更完整的浮點庫,用於取代GMP的mpf類型。

的評論太長.....

計算超過100位只是需要改變mpf_int(X),以mpf_init2(X,333)。 333位應至少獲得100位精度的小數位數,但您可能需要稍微增加。

由於gmp_printf()可能會將最後一位數字向上舍入,所以截斷輸出會更棘手。 「幾乎總是」工作的方法是使用mpf_get_str()創建一個精度超過100位的字符串,然後截斷字符串。

「幾乎總是」是因爲一串長長的九,例如... 599999999將被四捨五入到...... 600000000,截斷的字符串可能包括6.增加mpf計算的精度將降低機率遇到這個問題。

MPFR有mpfr_printf(),它允許您控制格式化輸出的舍入。例如,mpfr_printf(「%。100RZf,avg)將打印平均精度爲100位的數字並向零圓整。

+0

使用gmp實現它的任何機會? – deha

+0

我擴展了答案。 – casevh