Предположим, что я хочу использовать MPFR вычислить пи; У меня есть следующий код, который работает:
mpfr_t PI;
mpfr_t one;
mpfr_init(PI);
mpfr_init(one);
mpfr_set_d(one, 1, MPFR_RNDN);
mpfr_asin(PI, one, MPFR_RNDN);
mpfr_mul_d(PI, PI, 2, MPFR_RNDN);
Это эквивалентно «pi = 2 * arcsin (1)». Я признаю, что MPFR никогда не собирается точно скатываться с клавиатуры, но я новичок в этой библиотеке, и я хотел бы знать, есть ли способ избежать определения переменной «one»; я хотел бы, чтобы код выглядел так:
mpfr_t PI;
mpfr_init(PI);
mpfr_asin(PI, <the number 1>, MPFR_RNDN);
mpfr_mul_d(PI, PI, 2, MPFR_RNDN);
Я легко могу написать что-то, что принимает double и возвращает объект mpfr_t, вместо <…>. Мой настоящий вопрос: это где-то уже встроено в MPFR?
Редактировать: Я забыл упомянуть, что создание самой функции для возврата объекта mpfr_t не является хорошим решением, потому что это приводит к утечке памяти. Переменная должна была бы быть инициализирована внутри функции полезности, и тогда не было бы способа очистить ее. Единственное решение, о котором я знаю, — это написать оболочки для всех специальных функций, таких как arcsin и log. Я хотел бы более чистое решение, предпочтительно используя что-то встроенное в MPFR.
Задача ещё не решена.
Других решений пока нет …