使用printf
及其同类sprintf
和fprintf
显示mpreal
- 类型变量的值的正确语法是什么?我试过天真的演员加倍:
printf ("... %g ...", (double) var);
仅从g ++收到此错误消息:
error: invalid cast from type ‘mpfr::mpreal’ to type ‘double’
我在程序的其他地方使用double
- 类型变量没有问题。
我听说类型mpreal
是library的一部分,旨在使用通常的二元运算符来执行任意精度算术运算。
答案 0 :(得分:6)
mpreal
是任意精度浮点数字类型。
因此,mpreal
数字可能比double
具有更多有效数字(甚至数百或千分之一)。这意味着在显示之前无意义地将 mpreal
转换为 double
- 在这种情况下,您将失去所有原始准确性。
在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
class aka MPFR C++)
答案 1 :(得分:2)
mpreal
是一个类,而不是数字类型,它不会将转换运算符提供给数字类型。
但它确实提供了执行类型转换的成员函数:
long toLong() const;
unsigned long toULong() const;
double toDouble() const;
long double toLDouble() const;
所以这应该有效:
printf ("... %g ...", var.toDouble());
或:
printf ("... %Lg ...", var.toLDouble());
(我还没有证实这一点。)
更新:
mpreal
对象表示一个实数,其范围和/或精度可以比任何内置数值类型(这是MPFR的整个点)所表示的更大。仅当值在该类型的范围内时,转换为数字类型才有意义,并且您不关心额外的精度。
在某些情况下,这可能已经足够了,但正如this answer所述,您可以使用重载的<<
运算符或toString()
成员函数打印完整精度。