Как мне использовать GMP для создания массива с плавающей точкой? - PullRequest
0 голосов
/ 03 июня 2019

(Внимание: я новичок, поэтому некоторые из моих слов или поступков могут быть неуместными)

У меня была функциональная программа со следующим кодом в начале.

    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] };

К сожалению, тип данных long long не был достаточно большим, когда я расширил каждый из этих массивов до размера больше 17, и моя программа работала со сбоями.

Я узнал, что следующим шагом было использование библиотеки 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 Ответ

3 голосов
/ 03 июня 2019

Вы слышали о петлях? Они замечательные: -)

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]);
}

Теперь вам просто нужно расширить это на p2, p3 и т. Д.

Два комментария к вышеуказанному коду:

  1. объявление p1_init[] как static const просто для того, чтобы сделать код "чище". Как новичок, вы, вероятно, можете сбросить static const здесь, если у вас нет узнал об этом еще.

  2. c массивы начинаются с нуля. Все вменяемые языки программирования имеют нулевые массивы. Это означает, что в массиве с 17 элементами первый элемент имеет индекс 0, и последний элемент имеет индекс 16. Нет элемента с индексом 17

...