将 MPFR 数字转换为字符串并返回
Converting MPFR numbers to string and back
我正在尝试将 MPFR 数字转换为字符串,然后再返回。我使用的代码是:
int base = 10;
int input = 25;
mpfr_t number;
mpfr_inits2(53, number, (mpfr_ptr) 0);
mpfr_set_d(number, input, MPFR_RNDD);
mpfr_printf ("mpfr = %.17Rg\n", number);
char* str = NULL;
mpfr_exp_t e;
str = mpfr_get_str (NULL, &e, base, 0, number, MPFR_RNDN);
cout << "str: " << str << endl;
cout << "e: " << e << endl;
mpfr_t back;
mpfr_inits2(53, back, (mpfr_ptr) 0);
mpfr_set_str(back, str, base, MPFR_RNDD);
mpfr_set_exp(back, e);
mpfr_printf ("back = %.17Rg\n", back);
mpfr_free_str (str);
这给了我输出:
mpfr = 25
str: 25000000000000000
e: 2
back = 2.7755575615628914
如果我将基数更改为 2,那么我会得到正确的输出
mpfr = 25
str: 11001000000000000000000000000000000000000000000000000
e: 5
back = 25
但是如果我将输入更改为 0,我会再次得到错误的 mpfr 编号:
mpfr = 0
str: 00000000000000000000000000000000000000000000000000000
e: 0
back = 0.8125
我到底做错了什么?
您的代码中的错误是 e
是基数 base
中的指数,而不是基数 2 中的指数。您需要类似的东西(对于这种特定情况非常简化,对于正数仅):
char buffer[64];
sprintf (buffer, ".%s@%ld", str, (long) e);
mpfr_set_str (back, buffer, base, MPFR_RNDD);
mpfr_printf ("back = %.17Rg\n", back);
(@
而不是通常的 e
允许代码支持大于 10 的基数。)
另请注意,在您的第三个测试中,使用输入 0,您对值 0 调用 mpfr_set_exp
,这当前会产生无效的 MPFR 编号。在 MPFR 4 中,mpfr_set_exp
对更干净的 0 没有影响。
我正在尝试将 MPFR 数字转换为字符串,然后再返回。我使用的代码是:
int base = 10;
int input = 25;
mpfr_t number;
mpfr_inits2(53, number, (mpfr_ptr) 0);
mpfr_set_d(number, input, MPFR_RNDD);
mpfr_printf ("mpfr = %.17Rg\n", number);
char* str = NULL;
mpfr_exp_t e;
str = mpfr_get_str (NULL, &e, base, 0, number, MPFR_RNDN);
cout << "str: " << str << endl;
cout << "e: " << e << endl;
mpfr_t back;
mpfr_inits2(53, back, (mpfr_ptr) 0);
mpfr_set_str(back, str, base, MPFR_RNDD);
mpfr_set_exp(back, e);
mpfr_printf ("back = %.17Rg\n", back);
mpfr_free_str (str);
这给了我输出:
mpfr = 25
str: 25000000000000000
e: 2
back = 2.7755575615628914
如果我将基数更改为 2,那么我会得到正确的输出
mpfr = 25
str: 11001000000000000000000000000000000000000000000000000
e: 5
back = 25
但是如果我将输入更改为 0,我会再次得到错误的 mpfr 编号:
mpfr = 0
str: 00000000000000000000000000000000000000000000000000000
e: 0
back = 0.8125
我到底做错了什么?
您的代码中的错误是 e
是基数 base
中的指数,而不是基数 2 中的指数。您需要类似的东西(对于这种特定情况非常简化,对于正数仅):
char buffer[64];
sprintf (buffer, ".%s@%ld", str, (long) e);
mpfr_set_str (back, buffer, base, MPFR_RNDD);
mpfr_printf ("back = %.17Rg\n", back);
(@
而不是通常的 e
允许代码支持大于 10 的基数。)
另请注意,在您的第三个测试中,使用输入 0,您对值 0 调用 mpfr_set_exp
,这当前会产生无效的 MPFR 编号。在 MPFR 4 中,mpfr_set_exp
对更干净的 0 没有影响。