我是c语言的新手。 我想要做的是以仲裁精度获得商店pi并将其转换为字符串。
int calculatePIConst (int preciznost)
{
//init var
mpfr_t x;
mpfr_init2 (x, preciznost);
//populate pi
mpfr_const_pi (x, MPFR_RNDN);
//turn to string
char abc[preciznost];
int i;
//error RUN FINISHED; Segmentation fault; core dumped; real time: 90ms; user: 0ms; system: 0ms
// mpfr_get_str (abc, i, 50, 50, x, MPFR_RNDN);
//write pi
mpfr_printf ("PI = %1.1024RNf\n", x);
mpfr_clear (x);
return *abc;
}
这是mpfr lib文档文档http://www.mpfr.org/mpfr-current/mpfr.html#Miscellaneous-Functions
答案 0 :(得分:3)
最简单的方法是让MPFR分配字符串:
char* abc = NULL;
abc = mpfr_get_str (NULL, i, 10, 50, x, MPFR_RNDN);
printf ("PI = %s\n", abc);
mpfr_clear(x);
mpfr_free_str(abc);
同样从C++ wrapper for the MPFR检查此成员函数,例如:
inline std::string mpreal::toString(const std::string& format) const
{
char *s = NULL;
std::string out;
if( !format.empty() )
{
if(!(mpfr_asprintf(&s, format.c_str(), mpfr_srcptr()) < 0))
{
out = std::string(s);
mpfr_free_str(s);
}
}
return out;
}
事情是使用mpfr_asprintf,它自动分配并返回字符串(与mpfr_get_str相同),但也允许您使用格式规范。
答案 1 :(得分:1)
从您链接到的文档:
如果 str 不是空指针,它应该指向一个足够大的有效数据存储块,即至少max( n + 2,7) )。额外的两个字节用于可能的减号,对于终止空字符,值7用于 - @ Inf @加上终止空字符。
此外,我假设你希望你的结果在10,而不是50。
试试这个:
char abc[preciznost + 2]; /* assuming preciznost >= 5 */
:
mpfr_get_str (abc, i, 10, 50, x, MPFR_RNDN);
答案 2 :(得分:0)
您为preciznost
传递了什么价值?我看到调用可以处理非常大的位精度,并且存在使用声明打破堆栈的危险
char abc[preciznost];
我建议你在堆上分配内存,记住以后free()
。
char *abc = malloc(preciznost);
虽然目前还不清楚你将使用这个数组。如果它是'0'
或'1'
位值的字符串数组,则nul
终结符需要一个额外的字节,所以
char *abc = malloc(preciznost+1);
答案 3 :(得分:0)
原型是:
char *mpfr_get_str (char *str, mpfr_exp_t *expptr, int b, size_t n, mpfr_t op, mpfr_rnd_t rnd)
您的代码中有两个错误的内容:
数组不够大。见the answer by squeamish ossifrage。但是如果你选择使用等于0的n
,最好让MPFR分配字符串(在所有情况下也由Pavel Holoborodko建议)。
第二个参数必须是指向mpfr_exp_t
的指针。例如:
mpfr_exp_t e;
mpfr_get_str (abc, &e, 10, 50, x, MPFR_RNDN);
答案 4 :(得分:0)
根据Pavel的回答,我创建了这个函数来输出字符串。
string Autozoom::mpfrToString(const mpfr_t& in) {
int decimalLocation;
char* outChar = NULL;
mpfr_exp_t mpfrDecimalLocation;
outChar = mpfr_get_str(NULL, &mpfrDecimalLocation, 10, 0, in, MPFR_RNDN);
decimalLocation = mpfrDecimalLocation;
string out(outChar);
if (out[0] == '-') {
out.insert(decimalLocation + 1, ".");
}
else {
out.insert(decimalLocation, ".");
}
return out;
}
这实际上将取小数点的数字,将其插入字符串并返回。