如何将printf与mpfr和mpreal一起使用
How to use printf with mpfr and mpreal
使用printf
及其表亲sprintf
和fprintf
来显示mpreal
类型变量的值的正确语法是什么?我试过天真的选角来加倍:
printf ("... %g ...", (double) var);
只接收来自g++的错误消息:
error: invalid cast from type ‘mpfr::mpreal’ to type ‘double’
我在程序的其他地方使用double
类型的变量没有问题。
我听说mpreal
类型是这个库的一部分,它旨在使用常用的二进制运算符来执行任意精度的算术运算。
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 = %sn", pi.toString().c_str());
/* Custom format, 60 digits */
printf("pi = %sn", pi.toString("%.60RNf").c_str());
/* Using native printf from MPFR*/
mpfr_printf("pi = %.60RNfn", pi.mpfr_srcptr());
多精度数字的格式规范与标准的格式规范相同,但舍入规范除外。您可以安全地使用四舍五入到最接近的RN
,如上面的示例所示。
MPFR文档中提供了有关mp格式的更多详细信息。
(我是mpreal
类(又名MPFR C++)的作者
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的全部意义)。只有当值在数值类型的范围内时,转换为数值类型才有意义,并且您不在乎额外的精度。
在某些情况下,这可能已经足够好了,但正如这个答案所说,您可以使用重载的<<
运算符或toString()
成员函数打印全精度。
相关文章:
- 如何将enable-if与模板参数和参数包一起使用
- 如何将PERF_AMPLE_READ与mmap一起使用
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将C++中的库和头与MinGW一起使用
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 为什么我不能将 rand() 与数组的大小一起使用?
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 不能将复制初始化与隐式转换的多个步骤一起使用
- 将fold表达式与std::一起用于两个元组
- spdlog标头仅与外部fmt一起使用.spdlog错误:'内部':不是'fmt'
- 将 std::allocate_shared 与多态资源分配器一起使用
- 为什么常量词在重载运算符中不与 ostream 对象一起使用<<?
- 将 OpenCV 与 CMAKE 中的项目一起构建为第三方库的正确方法
- 将 exprtk 与自定义类的对象一起使用
- 将 std::set 与基于键的比较器一起使用
- 将 C++ 类与 Rcpp 一起使用,从 C 或 R 修改它
- 如何将 Eigen::Ref 与 pybind11 一起使用?
- 如何将AERT_Allocate与 std:vector 一起使用
- 如何使我的 sizeof sum 结构与空参数包一起工作
- 如何将printf与mpfr和mpreal一起使用