使用GMP精确损失

时间:2015-02-24 20:13:36

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

我有一个程序从字符串中读取数字到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位数字不正确。我怎么能避免这个?还有其他功能可以执行此转换吗?

由于

1 个答案:

答案 0 :(得分:6)

来自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精度计数参数来指定所需的精度位数。