การแปลงตัวเลขทศนิยมเป็นสตริงด้วย 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

ไม่มีจุดทศนิยมในเอาต์พุตสตริง!


person user2759621    schedule 25.09.2019    source แหล่งที่มา
comment
ตามเอกสาร นี่คือลักษณะการทำงาน   -  person NathanOliver    schedule 25.09.2019


คำตอบ (2)


จากเอกสารประกอบ

สตริงที่สร้างขึ้นนั้นเป็นเศษส่วน โดยมีฐาน โดยปริยาย ชี้ไปทางซ้ายของหลักแรกทันที ตัวอย่างเช่น ตัวเลข -3.1416 จะถูกส่งกลับเป็น "-31416" ในสตริง และ 1 เขียนที่ expptr

มันขึ้นอยู่กับคุณที่จะสร้างการแสดงที่มนุษย์สามารถอ่านได้สำหรับสตริงและเลขชี้กำลัง

อีกทางเลือกหนึ่งคือใช้ mpfr_sprintf

person n. 1.8e9-where's-my-share m.    schedule 25.09.2019
comment
ขอบคุณทุกคนสำหรับความช่วยเหลือ! - person user2759621; 26.09.2019

ฟังก์ชัน mpfr_get_str ของ MPFR ถูกคัดลอกไปยังฟังก์ชัน 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 และอนันต์)

person vinc17    schedule 26.09.2019