2012-03-08 36 views
2

使用printf及其親戚sprintffprintf顯示mpreal-類型變量的值的正確語法是什麼?我曾嘗試天真鑄造雙:如何在mpfr和mpreal中使用printf

printf ("... %g ...", (double) var); 

只從G ++收到此錯誤信息:

error: invalid cast from type ‘mpfr::mpreal’ to type ‘double’ 

我不得不使用double型變量別處上的程序沒有問題。

我聽說mpreal作爲library的一部分,旨在使普通的二元運算符能夠執行任意精度的算術運算。

+0

你接受了[我的答案](http://stackoverflow.com/a/9627136/827263),但[帕維爾的答案](HTTP:// stackoverflow.com/a/9627660/827263)可能會更好(請參閱我的更新)。 – 2013-11-01 01:26:30

回答

6

mpreal是任意精度浮點數值類型。

因此,mpreal數字可能比double有更多的有效數字(甚至數百或千分之一)。這意味着它是毫無意義的回合mprealdouble顯示之前 - 你將失去在這種情況下的所有原始準確性。

這是很容易在C++來顯示mpreal

/* 100-digits accurate pi */ 
mpreal pi = mpfr::const_pi(mpfr::digits2bits(100)); 

/* Show 60-digits of pi */ 
cout.precision(60); 
cout << pi; 

但是可以(由轉換爲字符串第一個)與printf以及使用它:

/* Display all digits (default formatting) */ 
printf("pi = %s\n", pi.toString().c_str());   

/* Custom format, 60 digits */ 
printf("pi = %s\n", pi.toString("%.60RNf").c_str()); 

/* Using native printf from MPFR*/ 
mpfr_printf("pi = %.60RNf\n", pi.mpfr_srcptr()); 

格式規範多精度數字與標準相同,四捨五入規格除外。如上例所示,您可以安全地使用四捨五入到最近的RN

有關mp格式的更多詳細信息,請參閱MPFR documentation

(我mpreal類又名MPFR C++的作者)

+0

嗨,感謝您的偉大圖書館:)工作真的很棒!我想問一個關於答案的簡單問題,沒有參數toString()仍然給我數字與科學表達式(即; e + 16)爲大數,我發現唯一的解決方法是與像toString(「%1024.1024RNf 「),確保打印所有數字。你知道一個更好的方法,以防止在例子中打印前導0。 (我的需要是簡單地將數字保存到數據庫中,讓其他程序像字符串一樣讀取它) – yagmoth555 2016-05-03 15:05:49

+1

不帶參數toString()將數字轉換爲字符串,數字足以將其從生成的字符串恢復,而不會損失準確性。在使用mpreal/MPFR之前不要忘記設置默認精度:mpfr :: mpreal :: set_default_prec() – 2016-05-04 02:18:13

1

mpreal是一類,而不是一個數字型,並且它不以數字類型提供轉換運算符。

但它確實提供了進行類型轉換的成員函數:

long   toLong() const; 
unsigned long toULong() const; 
double   toDouble() const; 
long double  toLDouble() const; 

所以這應該工作:

printf ("... %g ...", var.toDouble()); 

或:

printf ("... %Lg ...", var.toLDouble()); 

(我還沒有證實這)

UPDATE:

一種mpreal對象表示可具有大得多的範圍和/或精確度比可以表示爲實數的任何內置數字型(這是MPFR整點)。只有當值在該類型的範圍內時,轉換爲數字類型纔有意義,並且您不關心額外的精度。

在某些情況下,這可能是不夠好,但作爲this answer說,你就可以利用重載<<運營商或toString()成員函數打印完整的精度。