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