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

Converting a floating point number to string with 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

字符串输出没有小数点!

来自文档

The generated string is a fraction, with an implicit radix point immediately to the left of the first digit. For example, the number -3.1416 would be returned as "-31416" in the string and 1 written at expptr.

您可以根据字符串和指数生成人类可读的表示形式。

另一种方法是使用 mpfr_sprintf.

MPFR 的mpfr_get_str 函数是在GMP 的mpf_get_str 函数上复制的,解释了为什么选择不写小数点。有小数点有两种解决方法:

  1. 使用 mpfr_sprintf(或某些变体),如 中所建议。我会推荐这个解决方案(也许除非你想忽略语言环境),因为它是输出格式中最灵活的,不需要更正。
  2. 如果您只想要带有明确小数点的有效数字,请使用 mpfr_get_str,但使用指针 buffer+1 而不是 buffer。然后,做类似的事情(忽略语言环境)
    int neg = buffer[1] == '-';
    if (neg)
      buffer[0] = '-';
    buffer[neg] = '.';

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