我有一个程序从字符串中读取数字到mpz_t,然后将其转换为mpf_t。尽管从文件中正确读取,但是当我将它们转换为mpf_t时会出现精度损失。代码如下:
#include <gmp.h>
#include <stdlib.h>
#include <stdio.h>
int main (int argc, char **argv) {
char* str = "632512364206354367378453";
mpz_t x;
mpz_init_set_str(x, str, 10);
mpf_t a;
mpf_init(a);
mpf_set_z(a, x);
gmp_printf("mpz_t: %Zd\n", x);
gmp_printf("mpf_t: %Ff\n", a);
}
此示例的输出为:
mpz_t: 632512364206354367378453
mpf_t: 632512364206354367378000.000000
如您所见,最后3位数字不正确。我怎么能避免这个?还有其他功能可以执行此转换吗?
由于
答案 0 :(得分:6)
来自manual page:
功能:void mpf_init(mpf_t x)
将x初始化为0.通常,应在初始化之间使用mpf_clear仅初始化一次或至少清除变量。 x的精度未定义,除非已经有默认精度 通过调用mpf_set_default_prec建立。
有你的问题。
解决方案:
功能:void mpf_init2(mpf_t x,mp_bitcnt_t prec)
将x初始化为0并将其精度设置为至少为prec位。通常,变量应该仅初始化一次或至少初始化一次 在初始化之间使用mpf_clear清除。
这样,您可以使用prec
精度计数参数来指定所需的精度位数。