c - 真正基本的 mpir 问题

标签 c precision floating-point-precision pointer-arithmetic

我知道这是一个非常愚蠢的问题,但我希望有人能提供帮助。

出于精确原因,我不得不使用 mpir,所以我必须为它翻译我所有的 C 代码。基本上我只需要更重要的精度数字。

但是,我真的对用于我的变量的数据类型感到困惑。我知道 mpz_t 是整数。因为我存储的数字有很多小数位,所以这显然不合适,因为整数只是整数

mpq_t 用于有理数。因为我不认为存储的每个值都是有理数,所以我不明白这有什么合适的。

mpf_t 用于 float 。由于这具有“有限精度”,我看不出这对我的变量有何用处,因为我被告知使用 mpir 的主要原因是为了提高精度。

我只是希望能够以准确的方式表示我的数字,而我使用它的全部原因是因为有人告诉我,在对非常大的数字和非常小的数字进行算术运算时,它有助于保持准确性。我应该为 mpir 使用什么数据类型?有人告诉我我需要比四倍精度更高的精度。 :-(

我只是发现自己对整个事情感到困惑,需要一些关于使用什么数据类型以及如何确定精度级别的指导。如果可能,以非常简单的方式进行解释。

最佳答案

来自MPIR 2.6.0 documentation (PDF 链接),第 7 章:

MPIR floating point numbers are stored in objects of type mpf_t and functions operating on them have an mpf_ prefix.

The mantissa of each float has a user-selectable precision, limited only by available memory. Each variable has its own precision, and that can be increased or decreased at any time.

看起来它有各种函数可以帮助您设置精度,以位为单位,例如 mpf_set_default_precmpf_get_precmpf_set_prec

您应该使用mpf_t 作为数据类型,它的精度是有限的,但是MPIR 的优点是您可以设置该限制是什么。如果愿意,您可以使用 128 位作为 float 的尾数。这将是 32 位 float 的 4 倍以上。

来自Wikipedia on quadruple-precision floating-point format ,看起来四倍精度意味着 113 位的尾数/尾数,因此您可能希望将至少 113 位精度与 MPIR 一起使用以获得该精度级别。

关于c - 真正基本的 mpir 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15505993/

相关文章:

C 程序 - 接收段错误

java - 浮点精度: JDBC, double和DECIMAL,如何避免丢失?

c - 在 C 中舍入 float 变量以仅显示 2 位精度

c - 使用 Cython 生成的头文件

c - 局部变量与全局变量

java - Java 中从 double 转换为 int 时丢失精度

javascript - 为什么相同的 32 位 float 在 JavaScript 和 Rust 中不同?

c - 为什么点后只显示 6 个数字,尽管它是 double ?

c++ - double 和 float 比较

c - 运行具有重定向输入的 C 程序时如何知道是否 EOF?