我需要显示整数平均计算结果的前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 ...
所以有两件事:
因此对于(2/3)期望的输出是:
0.666 ... 666(6个,最后还有6个)
答案 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并向零舍入。