Mengubah bilangan floating point menjadi string dengan MPFR

Saya ingin mengubah angka floating point MPFR menjadi string. Jika saya menjalankan program saya, string akan dihasilkan tetapi tanpa tanda "." dalam nomor tersebut. Bagaimana saya bisa melakukannya dengan benar?

#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

Tidak ada titik desimal dalam keluaran string!


person user2759621    schedule 25.09.2019    source sumber
comment
Menurut dokumen beginilah seharusnya perilakunya.   -  person NathanOliver    schedule 25.09.2019


Jawaban (2)


Dari dokumentasi

String yang dihasilkan adalah pecahan, dengan titik radix implisit tepat di sebelah kiri digit pertama. Misalnya, angka -3.1416 akan dikembalikan sebagai "-31416" dalam string dan 1 ditulis di expptr.

Terserah pada Anda untuk menghasilkan representasi yang dapat dibaca manusia dari string dan eksponen.

Alternatifnya adalah menggunakan mpfr_sprintf.

person n. 1.8e9-where's-my-share m.    schedule 25.09.2019
comment
Terima kasih semuanya untuk bantuannya! - person user2759621; 26.09.2019

Fungsi mpfr_get_str MPFR disalin pada fungsi mpf_get_str GMP, menjelaskan mengapa fungsi tersebut dipilih untuk tidak menulis koma desimal. Ada dua solusi untuk memiliki titik desimal:

  1. Gunakan mpfr_sprintf (atau beberapa varian), seperti yang disarankan dalam jawaban ini. Saya akan merekomendasikan solusi ini (mungkin kecuali Anda ingin mengabaikan lokalnya), karena ini adalah yang paling fleksibel dalam format keluaran dan tidak memerlukan koreksi.
  2. Jika Anda hanya menginginkan signifikansi dengan titik desimal eksplisit, gunakan mpfr_get_str, tetapi dengan penunjuk buffer+1, bukan buffer. Kemudian, lakukan sesuatu seperti (abaikan lokalnya)
    int neg = buffer[1] == '-';
    if (neg)
      buffer[0] = '-';
    buffer[neg] = '.';

setelah memfilter kasus khusus (NaN dan infinitas).

person vinc17    schedule 26.09.2019