игра брюс 2048
Главная / Программирование / Программирование / Тест 143

Программирование - тест 143

Упражнение 1:
Номер 1
Рассмотрим 8 байтов, в которых записан некоторый
двочный код. Всегда ли он представляет
вещественное число, записанное в плавающей форме,
т.е. значение типа double?

Ответ:

 (1) Да, всегда.  

 (2) Нет, не всегда.  


Номер 2
Рассмотрим следующую программу на C/C++:

#include <stdio.h>
#include <math.h>

int main() {
    double x = pow(2., 1024.);
    double y = x / 2.;
    double z = pow(2., 1023.);
    if (y == z) {
        printf("y == z\n");
    } else {
        printf("y != z\n");
    }
    return 0;
}

(Функция pow(a, b) возводит
число a в степень b.)
Что будет напечатано в результате ее выполнения?

Ответ:

 (1) y == z.  

 (2) y != z.  


Номер 3
Рассмотрим следующую программу на C/C++:

#include <stdio.h>
#include <math.h>

int main() {
    double x = pow(2., 1022.)*2.;
    double y = pow(2., 1024.)/2.;
    if (x == y) {
        printf("x == y\n");
    } else {
        printf("x != y\n");
    }
    return 0;
}

(Функция pow(a, b) возводит
число a в степень b.)
Что будет напечатано в результате ее выполнения?

Ответ:

 (1) x == y.  

 (2) x != y.  


Упражнение 2:
Номер 1
Функция arctg(x) раскладывается
в ряд Тейлора следующим образом:

    arctg(x) = x - x3/3 + x5/5 - x7/7 + ...

Рассмотрим реализованную на C/C++ функцию myAtan(x),
вычисляющую значение arctg(x) с точностью до одной миллионной:

static const double EPS = 1e-6;

double myAtan(double x) {
    double s = 0.;
    double p = x;
    double n = 1.;
    double a = x;
    while (fabs(a) > EPS) {
        s += a;
        p = (-p*x*x);
        n += 2.;
        a = p/n;
    }
    return s;
}

Для каких значений x ее можно применять?
Укажите все правильные ответы из числа перечисленных ниже.

Ответ:

 (1) Для небольших по абсолютной величине значений x, например, |x| < 10.  

 (2) Для значений x в интервале -0.75<x<0.75  

 (3) Для x = 1.0001.  

 (4) Для x = -2.  


Номер 2
Функция ln(z) (натуральный логарифм z) представляется
в виде степенного ряда следующим образом:

    ln(1+x) = x - x2/2 + x3/3 - x4/4 + ...

(мы обозначили z=1+x).
Рассмотрим реализованную на C/C++ функцию myLog(z),
вычисляющую значение логарифма с точностью до одной миллионной:

static const double EPS = 1e-6;

double myLog(double z) {
    double x = z - 1.;
    double s = 0.;
    double p = x;
    double n = 1.;
    double a = x;
    while (fabs(a) > EPS) {
        s += a;
        p = (-p*x);
        n += 1.;
        a = p/n;
    }
    return s;
}

Для каких значений z ее можно применять так,
чтобы функция завершала работу за разумное время и
ошибка вычисления результата была бы не более 0.0001?
Укажите все правильные ответы из числа перечисленных ниже.

Ответ:

 (1) Для небольших положительных значений z, например, 0<z<10.  

 (2) Для любых значений z в интервале 0<z<2.  

 (3) Для z = 10-10.  

 (4) Для z = 2.0001.  

 (5) Для значений z в интервале 0.1 <z<1.9.  


Номер 3
Формула Бинома Ньютона дает следующее разложение в ряд
для функции "квадратный корень из z":

(1+x)0.5 = sqrt(1+x) =
    1 + 0.5 x + 0.5(-0.5)/2! x2 + 0.5(-0.5)(-1.5)/3! x3 + 0.5(-0.5)(-1.5)(-2.5)/4! x4 + ...

(мы обозначили z=1+x). 
Рассмотрим реализованную на C/C++ функцию mySqrt(z),
вычисляющую значение квадратного корня с точностью до одной миллионной:

static const double EPS = 1e-6;

double mySqrt(double z) {
    double x = z - 1.;
    double s = 1;
    double k = 0.5;
    double n = 1.;
    double a = k*x;
    while (fabs(a) > eps) {
        s += a;
        k -= 1.;
        n += 1.;
        a *= (k/n)*x;
    }
    return s;
}

Для каких значений z ее можно применять так,
чтобы функция завершала работу за разумное время и
ошибка вычисления результата была бы не более 0.0001?
Укажите все правильные ответы из числа перечисленных ниже.

Ответ:

 (1) Для небольших положительных значений z, например, 0<z<10.  

 (2) Для любых значений z в интервале 0<z<2.  

 (3) Для z = 10-10.  

 (4) Для z = 2.0001.  

 (5) Для z = 0.  

 (6) Для значений z в интервале 0.1<z<1.9.  


Упражнение 3:
Номер 1
Функция ln(z) (натуральный логарифм z) представляется
в виде степенного ряда следующим образом:

    ln(1+x) = x - x2/2 + x3/3 - x4/4 + ...

(мы обозначили z=1+x). Этот ряд сходится лишь для значений 
x, по абсолютной величине не превосходящих 1, а эффективно вычислять
его сумму можно только для еще более узкого интервала значений 
x. 
Какими свойствами функции ln(z)
удобнее всего воспользоваться, чтобы свести ее вычисление 
к суммированию ряда?

Ответ:

 (1) Свойством ln(z) = ln(z/n) + ln(n), где n - целая часть z.  

 (2) Свойствами ln(z) = 0.5*ln(z*z) при z < 0.5 и ln(z) = 2*ln(sqrt(z)) при z > 1.5.  

 (3) Свойствами ln(z) = ln(z/e) + 1 при z > 1.5 и ln(z) = ln(z*e) - 1 при z < 0.5.  


Номер 2
Формула Бинома Ньютона дает следующее разложение в ряд
для функции "квадратный корень из z":

(1+x)0.5 = sqrt(1+x) =
    1 + 0.5 x + 0.5(-0.5)/2! x2 + 0.5(-0.5)(-1.5)/3! x3 + 0.5(-0.5)(-1.5)(-2.5)/4! x4 + ...

(мы обозначили z=1+x). 
Этот ряд сходится лишь для значений 
x, по абсолютной величине не превосходящих 1, а эффективно вычислять
его сумму можно только для еще более узкого интервала значений 
x. 
Каким свойством функции sqrt(z)
удобнее всего воспользоваться, чтобы свести ее вычисление к суммированию ряда?

Ответ:

 (1) Свойством sqrt(z)=sqrt(n)*sqrt(z/n), где n - целая часть z.  

 (2) Свойствами sqrt(z) = sqrt(2)*sqrt(z/2) при z > 1.5 и sqrt(z) = sqrt(z*2)/sqrt(2) при z < 0.5.  

 (3) Свойствами sqrt(z) = 2*sqrt(z/4) при z > 1.5 и sqrt(z) = 0.5*sqrt(z*4) при z < 0.375.  


Номер 3
Формула Бинома Ньютона дает следующее разложение в ряд
для функции "кубический корень из z" 
(обозначим ее croot(z)):

(1+x)1/3 = croot(1+x) =
    1 + (1/3)x + (1/3)(-2/3)/2! x2 + (1/3)(-2/3)(-5/3)/3! x3 + (1/3)(-2/3)(-5/3)(-8/3)/4! x4 + ...

(мы сделали замену z=1+x). 
Этот ряд сходится лишь для значений 
x, по абсолютной величине не превосходящих 1, а эффективно вычислять
его сумму можно только для еще более узкого интервала значений 
x. 
Каким свойством функции croot(z)=z1/3
удобнее всего воспользоваться, чтобы свести ее вычисление 
для положительных значений z к суммированию ряда?

Ответ:

 (1) Свойством croot(z)=croot(n)*croot(z/n), где n - целая часть z.  

 (2) Свойствами croot(z) = 2*croot(z/8) при z > 1.6 и croot(z) = 0.5*croot(z*8) при 0 < z < 0.2.  

 (3) Свойствами croot(z) = croot(2)*croot(z/2) при z > 1.5 и croot(z) = croot(z*2)/croot(2) при 0 < z < 0.5.  


Упражнение 4:
Номер 1
Функция arctg(x) (ее также обозначают 
arctg или atan)
представляется рядом Тейлора:

    arctg(x) = x - x3/3 + x5/5 - x7/7 + ...

Этот ряд сходится лишь для значений x, по модулю не превосходящих
единицы, а эффективно вычислять его можно лишь для x, по модулю
существенно меньших единицы - например, |x|<0.5.
Чтобы свести задачу вычисления функции arctg(x) к
суммированию ряда для малых значений x,
можно воспользоваться формулой

    arctg(x) = 2*arctg(y), где y = x/(1 + sqrt(1 + x*x)),

заменив вычисление ряда для x вычислением для y.
Например, arctg(1)=2*arctg(1/(1+sqrt(2))). При этом нам придется
воспользоваться функцией sqrt, вычисляющей квадратный корень. Какое
максимальное число раз ее придется вызвать, чтобы свести вычисление 
arctg(x) для произвольного x к суммированию ряда для  
x в интервале |x|<0.5?

Ответ:

 (1) 1 раз.  

 (2) 2 раза.  

 (3) 3 раза.  

 (4) 4 раза.  

 (5) Для очень больших x может потребоваться многократное применение отображения x->y, поэтому число вызовов sqrt не ограничено.  


Номер 2
Функция arcsin(x) представляется рядом Тейлора:

    arcsin(x) = x +(1/2)x3/3 + (1/2)(3/4)x5/5 + (1/2)(3/4)(5/6)x7/7 + ...

Этот ряд сходится лишь для значений x, по модулю меньших
единицы, причем вблизи единицы сходится очень медленно и 
точность его вычисления низка. Поэтому эффективно вычислять 
сумму ряда можно лишь для x, по модулю
существенно меньших единицы - например, |x|<0.75. 
Каким свойством функции arcsin можно воспользоваться,
чтобы свести ее вычисление к суммированию ряда для значеий
x в интервале |x|<0.75? Укажите все
возможные правильные решения из числа перечисленных ниже.
(Предполагается, что мы умеем быстро и точно вычислять квадратный корень
sqrt(z), а также знаем константу pi.)

Ответ:

 (1) Воспользоваться нечетностью функции arcsin, сводящей ее вычисление к положительным значениям x. Для положительных значений x0.7 вычислить сумму указанного ряда. Для положительных значений x>0.7 воспользоваться формулой arcsin(x) = pi/2 - arcsin(sqrt(1 - x*x)) которая сводит задачу к вычислению ряда для значения y=sqrt(1-x*x).  

 (2) Свести вычисление функции arcsin к вычислению функции arctg, воспользовавшись формулой arcsin(x) = 2*arсtg( x / (1 + sqrt(1 - x*x)) ).  

 (3) При x = ±1 значение arcsin(x) = ±pi/2. При других значениях x воспользоваться формулой arcsin(x) = arсtg(x / sqrt(1 - x*x)) и для y=x/sqrt(1-x*x) вычислить сумму ряда Тейлора функции arctg: arctg(y) = y - y3/3 + y5/5 - y7/7 + ...  


Номер 3
Функция arctg(x) (ее также обозначают 
arctan или atan)
представляется рядом Тейлора:

    arctg(x) = x - x3/3 + x5/5 - x7/7 + ...

Этот ряд сходится лишь для значений x, по модулю не превосходящих
единицы, а эффективно вычислять его можно лишь для x, по модулю
существенно меньших единицы - например, |x|<0.5.
(Для значений x, по модулю близких к единице и не превосходящих
единицу, ряд сходится, но очень медленно, а точность вычисления его суммы
невысока.)
Какие способы вычисления функции arctan(x) для "плохих"
значений x возможны? Укажите все разумные способы из
числа перечисленных ниже.
(Предполагается, что мы умеем быстро и точно вычислять квадратный корень
sqrt(z), а также знаем константу pi.)

Ответ:

 (1) Применив формулу arctg(x) = 2*arctg(y), где y = x/(1 + sqrt(1 + x*x)) один или несколько раз, мы сведем вычисление arctg(x) к вычислению arctg(y) для меньшего по модулю значения y.  

 (2) Применив формулу arctg(x) = arcsin(x / sqrt(1 + x*x)), мы сведем задачу к вычислению функции arcsin(y), где y=x/sqrt(1+x*x). Значение arcsin(y) можно вычислить как сумму ряда, когда |y| существенно меньше единицы (например, |y|<0.75): arcsin(x) = x +(1/2)x3/3 + (1/2)(3/4)x5/5 + (1/2)(3/4)(5/6)x7/7 + ... Для значений y, по модулю близких к единице, этот ряд сходится очень медленно, поэтому для них можно дополнительно воспользоваться формулой arcsin(y) = pi/2 - arcsin(sqrt(1 - y*y)), которая сводит задачу к вычислению ряда функции arcsin(z) для значения z=sqrt(1-y*y).  

 (3) Функция arctg(x) нечетная, поэтому достаточно уметь ее вычислять только для неотрицательных x. Для 0 x 1 вычисляется сумма указанного ряда. Для x>1 применим формулу arctg(x) = pi/2 - arctg(1/x), сведя задачу к суммированию ряда для функции arctg(y), где y=1/x и значение y меньше единицы.  




Главная / Программирование / Программирование / Тест 143