如何使用mpfr和mpreal的printf

时间:2012-03-08 23:38:54

标签: c++ casting double printf mpfr

使用printf及其同类sprintffprintf显示mpreal - 类型变量的值的正确语法是什么?我试过天真的演员加倍:

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

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

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

我在程序的其他地方使用double - 类型变量没有问题。

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

2 个答案:

答案 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()成员函数打印完整精度。