将 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 = %.17Rgn", 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 = %.17Rgn", 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 = %.17Rgn", back);
(@
而不是通常的e
允许代码支持大于 10 的碱基。
另请注意,在第三次测试中,输入 0 时,对值 0 调用mpfr_set_exp
,该值当前会产生无效的 MPFR 编号。在 MPFR 4 中,mpfr_set_exp
对 0 没有影响,0 更干净。
相关文章:
- 当分配一个字符串值并稍后通过分配另一个值进行更改时C++如何管理内存?
- std::regex:匹配由数字和空格组成的字符串,并提取数字.如何?
- 连接资源文件中的字符串,并将其传递给菜单项字符串 (winapi) c++
- 拆分字符串输入并查找字符是否有效
- 二进制字符数组转换为字符串流并从缓冲区弹出
- 文本文件中的 grep 字符串,并将它们复制到 CMake 中的目录中
- C++最快的字符串小写并查找
- 从文件到字符串读取并传递到功能
- 如何在其中创建2D字符串向量并插入数据
- 输入到字符串流并在单个语句中转换为字符串.可以没有帮助程序类
- 如何查找查看一个字符串是否位于另一个字符串内部并替换它
- std::variant 存储多个字符串类型并区分它们
- 有没有办法将数字作为字符串,并在不使用浮点数或双精度数的情况下将其四舍五入到确切的位数
- 将char添加到字符串中并删除char数组
- 如何将浮子值的字节存储在字符串中并以后检索值
- 如何存储在字符串中并转换为字符数组
- 如何记录QObject::tr的原始字符串,并仍然向GUI显示翻译
- 在班级中使用动态分配的C风格字符串,并带有复制和分配操作员,给出了意外的结果
- 将utf8编码的字符串转换为本地8位编码的字符串,并将无法确定的字符替换为空白
- 将浮点数转换为字符串,并指定精度和十进制数字数?