使用MPFR将浮点数转换为字符串

时间:2019-09-25 15:49:54

标签: c++ floating-point mpfr

我想将MPFR浮点数转换为字符串。 如果我运行程序,则将生成字符串,但不包含“。”。在数量上。我该怎么办?

#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <mpreal.h>

using mpfr::mpreal;
using std::cout;
using std::endl;

int main (int ac, char *av[])
{
    char data[255];
    mpreal x = 42.0, y = 3.14159265358979323846, res = 0.0;
    mp_exp_t exponent = 10;

    // string data_str[256];

    int precision = 50;
    res = x * y;

    cout.precision(100);
    cout << res;
    cout << "\n";

    // if (mpfr_snprintf (data, 254, "%.20Ff", res.mpfr_srcptr()) < 0)
/*
    if (mpfr_snprintf (data, 254, "%.20Ff", res.mpfr_srcptr()) < 0)
    {
        cout << "gmp_prints_float: error saving string!\n";
    }
    */

    mpfr_get_str ((char *) &data, &exponent, 10, precision, res.mpfr_srcptr(), GMP_RNDN);

    cout << data;
    cout << "\n";

     mpfr_free_cache ();
}

131.946891450771317977341823279857635498046875 13194689145077131797734182327985763549804687500000

字符串输出中没有小数点!

2 个答案:

答案 0 :(得分:1)

从文档中

  

生成的字符串是一个分数,在第一个数字的左侧紧接一个隐式小数点。例如,数字-3.1416将在字符串中返回为“ -31416”,并在expptr处返回1。

由您来根据字符串和指数生成易于理解的表示形式。

一种替代方法是使用mpfr_sprintf

答案 1 :(得分:0)

MPFR的mpfr_get_str函数被复制到GMP的mpf_get_str函数中,解释了为什么选择不写小数点。有两种解决方案可以带小数点:

  1. 按照this answer中的建议使用mpfr_sprintf(或某些变体)。我会推荐这种解决方案(也许除非您想忽略语言环境),因为它在输出格式中是最灵活的,不需要更正。
  2. 如果您只想使用显式小数点表示有效位数,请使用mpfr_get_str,但使用指针buffer+1而不是buffer。然后,执行类似(忽略语言环境)的操作
    int neg = buffer[1] == '-';
    if (neg)
      buffer[0] = '-';
    buffer[neg] = '.';

在过滤掉特殊情况(NaN和无穷大)之后。