2017-08-15 74 views
0

我试图将MPFR号码转换为字符串,然后返回。我正在使用的代码是:将MPFR号码转换为字符串并返回

int base = 10; 
int input = 25; 

mpfr_t number; 
mpfr_inits2(53, number, (mpfr_ptr) 0); 
mpfr_set_d(number, input, MPFR_RNDD); 
mpfr_printf ("mpfr = %.17Rg\n", number); 

char* str = NULL; 
mpfr_exp_t e; 
str = mpfr_get_str (NULL, &e, base, 0, number, MPFR_RNDN); 

cout << "str: " << str << endl; 
cout << "e: " << e << endl; 

mpfr_t back; 
mpfr_inits2(53, back, (mpfr_ptr) 0); 
mpfr_set_str(back, str, base, MPFR_RNDD); 
mpfr_set_exp(back, e); 
mpfr_printf ("back = %.17Rg\n", back); 

mpfr_free_str (str); 

这使我的输出:

mpfr = 25 
str: 25000000000000000 
e: 2 
back = 2.7755575615628914 

如果我改变基地2,然后我得到正确的输出

mpfr = 25 
str: 11001000000000000000000000000000000000000000000000000 
e: 5 
back = 25 

但如果我将输入更改为0,我又会得到错误的mpfr号码:

mpfr = 0 
str: 00000000000000000000000000000000000000000000000000000 
e: 0 
back = 0.8125 

我究竟做错了什么?

回答

1

在你的代码中的错误是e在基地base指数,而不是一个在基地2.你需要这样的东西(很简化了这种特定的情况下,只有正数):

char buffer[64]; 
sprintf (buffer, ".%[email protected]%ld", str, (long) e); 
mpfr_set_str (back, buffer, base, MPFR_RNDD); 
mpfr_printf ("back = %.17Rg\n", back); 

(该@而不是通常的e允许代码来支持基地比10大)

另外请注意,在你的第三个测试,具有输入0,你的值为0,目前产生了无效MPFR调用mpfr_set_exp数。在MPFR 4中,mpfr_set_exp对0更为清晰。

相关问题