如何使用GMP创建浮点数组?

时间:2019-06-02 21:12:42

标签: c++ c arrays gmp

(警告:我是一个初学者,所以我所说或做的话可能不正确)

我有一个带有以下代码的功能程序。

    long double p1[] = { 1,0.708894879,0.264150943,0.105121294,0.525,0.437,0.916,0.237516005,1,0.516431925,1,0.799001248,0.436363636,0.45631068,0.4484375,0.366459627,0.369811321 };
    long double p2[] = { 1,0.529569892,0.346774194,0.107526882,0.587,0.353,0.885,0.475672215934624,1,0.446280992,1,0.678756477,0.585185185,0.489552239,0.408396947,0.266129032,0.463316583 };
    long double p3[] = { 1,0.52,0.163333333,0.07,0.516,0.402,0.816,0.667733676304516,1,0.518375242,1,0.761016949,0.462686567,0.445783133,0.416481069,0.368794326,0.557907845579078 };
    long double p4[] = { 1,0.53038674,0.367403315,0.121546961,0.551,0.274,0.736,0.899487836785253,1,0.268817204,1,0.681481481,0.36,0.382352941,0.27173913,0.209302326,0.0978260869565217 };
    long double p5[] = { 1,0.624203822,0.382165605,0.248407643,0.549,0.285,0.692,1.0,1,0.621212121,1,0.934131737,0.390243902,0.24,0.275641026,0.090909091,0.143968871595331 };
    long double* p[] = { &p1[17], &p2[17], &p3[17], &p4[17], &p5[17], &p6[17] };

不幸的是,一旦我将这些数组中的每一个扩展到大于17的大小,“ long double”数据类型就不够大,并且我的程序出现故障。

我了解到下一步是使用GMP库。我已经实现了GMP库,但是我不知道如何使用它来替换“ long double”。我特别无法设置数组值。

GMP文档说:“必须先将mpf_t对象初始化,然后才能在其中存储第一个值。”所以,我这样初始化了我的对象:

    mpf_t p1[17];
    mpf_t p2[17];
    mpf_t p3[17];
    mpf_t p4[17];
    mpf_t p5[17];
    mpf_t p6[17];
    mpf_t p[17];

此代码没有明显的错误。

但是,我没有一种像在原始代码中那样显式设置数组值的方法。我查看了文档,但所有相关功能似乎只包含两个参数。

也许我必须做类似的事情:

    mpf_set_d (p1[1], 1);
    mpf_set_d (p1[2], 0.708894879);
    ...

但是我假设情况并非如此。尽管它可以正常工作,但它非常繁琐,并且涉及很多复制粘贴,据我所知,这是不良技术的标志。

有更好的方法吗?

预先感谢

1 个答案:

答案 0 :(得分:3)

您听说过循环吗?他们很棒:-)

static const double p1_init[] = { 1,0.708894879,0.264150943,0.105121294,0.525,0.437,0.916,0.237516005,1,0.516431925,1,0.799001248,0.436363636,0.45631068,0.4484375,0.366459627,0.369811321 };

mpf_t p1[17];

for (int i = 0; i < 17; i++)
{
   mpf_init (p1[i]);
   mpf_set_d (p1[i], p1_init[i]);
}

现在,您只需要将此扩展到p2p3等。

上面的代码有两个注释:

  1. p1_init[]声明为static const只是为了使代码更“干净”。 如果您还没有初学者,可以将static const放在此处 学会了它。

  2. c数组基于零。所有理智的编程语言都具有从零开始的数组。 这意味着在具有17个元素的数组中,第一个元素的索引为0,并且 最后一个元素的索引为16。没有索引为17的元素