Sir*_*out 2 c++ double printf casting mpfr
使用printf及其表兄弟sprintf和fprintf显示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是该库的一部分,旨在使用通常的二元运算符来执行任意精度算术运算.
的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文档.
(我是mpreal类MPFR C++的作者)