Преобразование числа с плавающей запятой в строку с MPFR - PullRequest
0 голосов
/ 25 сентября 2019

Я хочу преобразовать число 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 ]

1 голос
/ 25 сентября 2019

Из документации

Сгенерированная строка является дробной, с неявной точкой радиуса непосредственно слева от первой цифры.Например, число -3.1416 будет возвращено как "-31416" в строке и 1 будет записано в expptr.

Вы должны сгенерировать удобочитаемое представление для строки ипоказатель.

Альтернативой может быть использование mpfr_sprintf.

0 голосов
/ 26 сентября 2019
Функция

MPFR mpfr_get_str скопирована в функцию mpf_get_str GMP, объясняя, почему она была выбрана, чтобы не записывать десятичную точку.Существует два решения с десятичной точкой:

  1. Используйте mpfr_sprintf (или некоторый вариант), как предложено в в этом ответе .Я бы порекомендовал это решение (возможно, если вы не хотите игнорировать локали), так как оно является наиболее гибким в выходном формате и не нуждается в исправлении.
  2. Если вам просто нужно значение и с явной десятичной точкойиспользуйте mpfr_get_str, но с указателем buffer+1 вместо buffer.Затем выполните что-то вроде (без учета локалей)
    int neg = buffer[1] == '-';
    if (neg)
      buffer[0] = '-';
    buffer[neg] = '.';

после фильтрации особых случаев (NaN и бесконечности).

...