Главная / Программирование /
Программирование / Тест 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
меньше единицы.