2017-08-15 73 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更爲清晰。

相關問題