任意浮点精度数到字符串

时间:2015-03-17 11:30:56

标签: c pi mpfr

我是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

5 个答案:

答案 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)

您的代码中有两个错误的内容:

  1. 数组不够大。见the answer by squeamish ossifrage。但是如果你选择使用等于0的n,最好让MPFR分配字符串(在所有情况下也由Pavel Holoborodko建议)。

  2. 第二个参数必须是指向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;
}

这实际上将取小数点的数字,将其插入字符串并返回。