|
Текст подпрограммы и версий pa06r_c.zip pa06d_c.zip |
Тексты тестовых примеров tpa06r_c.zip tpa06d_c.zip |
Вычисление значения непрерывной дроби.
pa06r_c вычисляет значение суммы N звеньев непрерывной дроби
fN = b0 + a1 / ( b1 + a2 / ( b2 + ... + aN / ( bN )...) ) .
real pa06r_c (real *b0, real *a, real *b, integer *n)
Параметры
| b0 - | значение коэффициента b0 непрерывной дроби (тип: вещественный); |
| a, b - | вещественные векторы длины n, компонентами которых являются коэффициенты ai и bi ( i = 1, ..., n) непрерывной дроби; |
| n - | заданное число звеньев непрерывной дроби (тип: целый). |
Версии
| pa06d_c - | вычисление значения непрерывной дроби в режиме удвоенной точности. При этом параметры b0, a, b должны иметь тип double. |
Вызываемые подпрограммы: нет
Замечания по использованию
| В подпрограммах - функциях pa06r_c и pa06d_c имeeтcя внешняя структура с именем pa06rr_ , содержащая элемент целого типа с именем nreal. Знaчeниe пepeмeннoй nreal пoлaгaeтcя равной номеру звена непрерывной дроби, для которого fnreal = fnreal - 1 . |
Пусть требуется вычислить сумму 10 звеньев непрерывной дроби
arctg x = x / (1 + x2 / (3 + 4 x2 / (5 + 9 x2 / (7 + ... )...))) при x = 0.2
struct {
int nreal;
} pa06rr_;
#define pa06rr_1 pa06rr_
int main(void)
{
/* Local variables */
extern float pa06r_c(float *, float *, float *, int *);
static float a[10], b[10];
static int i__, n;
static float x, b0, res;
int i__1;
n = 10;
x = .2f;
b0 = 0.f;
a[0] = x;
b[0] = 1.f;
for (i__ = 2; i__ <= 10; ++i__) {
/* Computing 2nd power */
i__1 = i__ - 1;
a[i__ - 1] = i__1 * i__1 * x * x;
b[i__ - 1] = (float) ((i__ << 1) - 1);
/* L1: */
}
res = (float)pa06r_c(&b0, a, b, &n);
printf("\n %16.7e \n", res);
printf("\n %5i \n", pa06rr_1.nreal);
return 0;
} /* main */
Результаты: res = 0.1973956 , nreal = 6