【问题标题】:Precision loss with GMPGMP 的精度损失
【发布时间】:2015-04-26 15:25:17
【问题描述】:

我有一个程序,它从字符串中读取数字到 mpz_t,然后将其转换为 mpf_t。尽管从文件中正确读取,但当我将它们转换为 mpf_t 时存在精度损失。代码如下:

#include <gmp.h>
#include <stdlib.h>
#include <stdio.h>

int main (int argc, char **argv) {
    char* str = "632512364206354367378453";
    mpz_t x;

    mpz_init_set_str(x, str, 10);

    mpf_t a;
    mpf_init(a);
    mpf_set_z(a, x);
    gmp_printf("mpz_t: %Zd\n", x);
    gmp_printf("mpf_t: %Ff\n", a);
}

这个例子的输出是:

mpz_t: 632512364206354367378453
mpf_t: 632512364206354367378000.000000

如您所见,最后 3 位数字不正确。我怎样才能避免这种情况?是否有任何其他函数可以执行此转换?

谢谢

【问题讨论】:

    标签: c++ c precision floating-point-precision gmp


    【解决方案1】:

    来自manual page

    函数:void mpf_init (mpf_t x)

    将 x 初始化为 0。通常,一个变量应该只初始化一次,或者至少在初始化之间使用 mpf_clear 清除一次。 除非默认精度已经存在,否则 x 的精度是未定义的 通过调用 mpf_set_default_prec 建立。

    这是你的问题。

    解决方案:

    函数:void mpf_init2 (mpf_t x, mp_bitcnt_t prec)

    将 x 初始化为 0 并将其精度设置为至少 prec 位。通常,一个变量应该只初始化一次或至少初始化一次 在初始化之间使用 mpf_clear 清除。

    这样,您可以使用prec 精度计数参数来指定您想要多少位精度。

    【讨论】:

    • 是否有任何函数可以从 mpz_t 中获取精度,然后我可以使用它来初始化 mpf_t?
    • @fc67 mpz_sizeinbase 可以提供帮助。
    猜你喜欢
    • 1970-01-01
    • 2014-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    相关资源
    最近更新 更多