我想将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
字符串输出中没有小数点!
答案 0 :(得分:1)
从文档中
生成的字符串是一个分数,在第一个数字的左侧紧接一个隐式小数点。例如,数字-3.1416将在字符串中返回为“ -31416”,并在expptr处返回1。
由您来根据字符串和指数生成易于理解的表示形式。
一种替代方法是使用mpfr_sprintf
。
答案 1 :(得分:0)
MPFR的mpfr_get_str
函数被复制到GMP的mpf_get_str
函数中,解释了为什么选择不写小数点。有两种解决方案可以带小数点:
mpfr_sprintf
(或某些变体)。我会推荐这种解决方案(也许除非您想忽略语言环境),因为它在输出格式中是最灵活的,不需要更正。mpfr_get_str
,但使用指针buffer+1
而不是buffer
。然后,执行类似(忽略语言环境)的操作int neg = buffer[1] == '-'; if (neg) buffer[0] = '-'; buffer[neg] = '.';
在过滤掉特殊情况(NaN和无穷大)之后。