2012-10-09 60 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