GMP - 分割精度或印刷问题

时间:2012-10-09 16:25:17

标签: c++ gmp

我需要显示整数平均计算结果的前100个含义数字。整数系列存储在mpz_t类型的数组中,然后它总和为mpq_t并除以另一个mpq_t(计数)

代码:

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);    

最后一行显示,假设sum = 2,count = 3是错误的。它在大约10-15位后被填充并填充0.对于(2/3)它是0.66666666670000 ...

所以有两件事:

  1. 我不想发布/ ceil,只需在100位后截断
  2. 用含义数字
  3. 填写所有100位数字

    因此对于(2/3)期望的输出是:

    0.666 ... 666(6个,最后还有6个)

1 个答案:

答案 0 :(得分: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位精度打印avg并向零舍入。