如何使用mpfr和mpreal的printf

Sir*_*out 2 c++ double printf casting mpfr

使用printf及其表兄弟sprintffprintf显示mpreal-type变量值的正确语法是什么?我试过天真的铸造加倍:

printf ("... %g ...", (double) var);
Run Code Online (Sandbox Code Playgroud)

仅从g ++接收此错误消息:

error: invalid cast from type ‘mpfr::mpreal’ to type ‘double’
Run Code Online (Sandbox Code Playgroud)

double在程序的其他地方使用-type变量没有问题.

我听说该类型mpreal是该库的一部分,旨在使用通常的二元运算符来执行任意精度算术运算.

Pav*_*dko 6

mpreal是任意精度浮点数值类型.

因此,mpreal数字可能具有更多有效数字(甚至数百或千分之一)double.这意味着在显示之前进行舍 mpreal 没有意义的double - 在这种情况下,您将失去所有原始精度.

它很容易mpreal用C++ 显示:

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

/* Show 60-digits of pi */
cout.precision(60);
cout << pi;
Run Code Online (Sandbox Code Playgroud)

但是你也可以使用它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());
Run Code Online (Sandbox Code Playgroud)

多精度数字的格式规范与标准相同,但舍入规范除外.您可以安全地使用舍入到最近,RN如上例所示.

有关mp格式的更多详细信息,请参阅MPFR文档.

(我是mprealMPFR C++的作者)