Задача №202Найдите ошибку:
#include <stdio.h>
#include <math.h>
int main()
{
double x;
for (x = 0; x != 1; x += 1./6) {
printf("sqrt(%lg) = %lg\n", x, sqrt(x));
}
}
Догадайтесь, что должна сделать программа, определить почему она работает (или может работать) не так, и предложите исправление.
(Решение задачи №202)
а) Программа должна вывести квадратные корни из чисел вида
, где
,
.
б) Она может работать неправильно, поскольку для сравнения вещественных чисел используется способ, применимый только для целых чисел.
в) Правильный код:
Код:
#include <stdio.h>
#include <math.h>
int main()
{
double eps = 1e-10;
double x;
for ( x = 0; fabs(x - 1) > eps; x += 1./6 ) {
printf("sqrt(%lg) = %lg\n", x, sqrt(x));
}
}
Здесь
eps число, достаточно малое по сравнению с шагом приращения (
).
P.S. От себя добавлю, что предпочитаю (в циклах) сравнениям типа
Код:
x != 1
сравнения
Код:
x < 1
в виду их большей безопасности. Для вещественных чисел это выглядит так:
Код:
x < 1 - eps
Этот вариант м.б. предпочтительнее и в данном случае (если бы число итераций было заметно больше), т.к. многократные операции сложения
Код:
x += 1./6
постепенно аккумулируют ошибку (вследствие чего целесообразно заменять их операциями умножения с потенциальной переделкой всего цикла на основе целочисленного счетчика и понижением производительности).
P.P.S. В оффтопе тег
syntax почему-то работает некорректно.
Задача №210а) В названии этого произведения по традиции должно было бы фигурировать наименование денежной единицы.
б) С "именами" двух из трех главных героев возникла путаница при переводе. Настоящим именем обладает только один из них, двое других отзываются на забавные прозвища.
в) Способность каждого делать это едва не переступает за грань реальности.
Что за произведение имеется в виду и какова удивительная способность главных героев?