fc6*_*c67 2 c c++ precision gmp floating-point-precision
我有一个程序,从字符串中读取数字到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);
}
Run Code Online (Sandbox Code Playgroud)
此示例的输出是:
mpz_t: 632512364206354367378453
mpf_t: 632512364206354367378000.000000
Run Code Online (Sandbox Code Playgroud)
如您所见,最后3位数字不正确.我怎么能避免这个?还有其他功能可以执行此转换吗?
谢谢
从手册页:
功能:void mpf_init(mpf_t x)
将x初始化为0.通常,应在初始化之间使用mpf_clear仅初始化一次或至少清除变量. 除非通过调用mpf_set_default_prec建立了默认精度,否则x的精度是未定义的.
这是你的问题.
解:
功能:void mpf_init2(mpf_t x,mp_bitcnt_t prec)
将x初始化为0并将其精度设置为至少为prec位.通常,变量应该初始化一次,或者至少在初始化之间使用mpf_clear清除.
这样,您可以使用precprecision count参数指定所需的精度位数.