2015-02-24 137 views
2

我有一个程序,它将字符串中的数字读入到mpz_t中,然后将其转换为mpf_t。尽管从文件中正确读取,但我将它们转换为mpf_t时会出现精度损失。代码如下:使用GMP精确丢失

#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个位数是不正确的。我怎样才能避免这种情况?是否有任何其他功能来执行此转换?

由于

回答

6

manual page

Function:无效mpf_init(mpf_t X)

初始化X为0。通常情况下,变量应仅一次或至少初始化被清除,在初始化之间使用mpf_clear。 x的精度未定义,除非通过调用mpf_set_default_prec已建立默认精度 。

这是你的问题。

解决方案:

Function:无效mpf_init2(mpf_t X,mp_bitcnt_t PREC)

初始化X为0,并设置其精度为至少PREC比特。通常情况下,一个变量只能初始化一次,或者至少在初始化之间用mpf_clear清除掉 。

这样,您可以使用prec precision count参数来指定您想要的精度位数。

+0

是否有任何函数可以从mpz_t中获取精度,然后我可以使用它来初始化mpf_t? – fc67 2015-02-24 21:26:41

+4

@ fc67'mpz_sizeinbase'可以提供帮助。 – 2015-02-24 22:08:42