Предмет: Информатика,
автор: BBSyN
Найти значение функции y=√(x-1)/(sin 1/x)в промежутке [1.2;2] с шагом 0.1
Ответы
Автор ответа:
0
Как известно, нецелые числа в компьютере далеко не всегда представляются точно, поскольку большую часть их даже теоретически невозможно точно перевести в двоичную систему. Это порождает проблемы при проверках на точное равенство. Например, если мы попробуем перевести в двоичную систему число 0.1, то не сможем этого сделать и в компьютере вместо 0.1 будет храниться число, которое чуть-чуть, но все же меньше. Многократно увеличивая шагами какую-то величину на 0.1 мы все больше и больше будет удаляться от правильного (ожидаемого) значения и при проверка на точное равенство нас неприятно удивит. Поэтому в предыдущем ответе, несмотря на то, что диапазон задавался [1.2;2], проверка делается на 2.1 (можно и на 2.0000001 было делать).
Есть другой способ писать программы для табуляции функций.
1) Находим, сколько значений нужно получить
Для этого от конечного значения вычитаем начальное, делим на шаг, берем целую часть результата и увеличиваем на единицу.
(2-1.2)/0.1=8, 8+1=9 - именно столько раз выполнится цикл.
Да-да, мы делаем традиционный цикл со счетчиком (for), в котором i будет меняться от 0 до 8.
2) получим формулу для вычисления значения аргумента.
При i=0 значение х(0)=1.2. При i=1 должно получиться x(1)=1.3.
Легко найти зависимость: x(i)=1.2+i/10. Можно пожалеть компьютер и переписать это выражение в виде x(i)=(12+i)/10, потому что в первом случае будут операции а) перевод i в real б) сложение двух real в) деление двух real, а во втором - а) сложение двух integer б) перевод в real в) деление двух real и это быстрее.
var
i:integer;
x,y:real;
begin
for i:=0 to 8 do begin
x:=(12+i)/10;
y:=sqrt(x-1)/sin(1/x);
Writeln(x:3:1,y:10:6)
end
end.
Результат
1.2 0.604198
1.3 0.787430
1.4 0.965466
1.5 1.143501
1.6 1.323877
1.7 1.507784
1.8 1.695869
1.9 1.888486
2.0 2.085830
Есть другой способ писать программы для табуляции функций.
1) Находим, сколько значений нужно получить
Для этого от конечного значения вычитаем начальное, делим на шаг, берем целую часть результата и увеличиваем на единицу.
(2-1.2)/0.1=8, 8+1=9 - именно столько раз выполнится цикл.
Да-да, мы делаем традиционный цикл со счетчиком (for), в котором i будет меняться от 0 до 8.
2) получим формулу для вычисления значения аргумента.
При i=0 значение х(0)=1.2. При i=1 должно получиться x(1)=1.3.
Легко найти зависимость: x(i)=1.2+i/10. Можно пожалеть компьютер и переписать это выражение в виде x(i)=(12+i)/10, потому что в первом случае будут операции а) перевод i в real б) сложение двух real в) деление двух real, а во втором - а) сложение двух integer б) перевод в real в) деление двух real и это быстрее.
var
i:integer;
x,y:real;
begin
for i:=0 to 8 do begin
x:=(12+i)/10;
y:=sqrt(x-1)/sin(1/x);
Writeln(x:3:1,y:10:6)
end
end.
Результат
1.2 0.604198
1.3 0.787430
1.4 0.965466
1.5 1.143501
1.6 1.323877
1.7 1.507784
1.8 1.695869
1.9 1.888486
2.0 2.085830
Автор ответа:
0
Рассуждали долго, но программа получилась короткой. так всегда и бывает. Конечно, обычно такие рассуждения не приводят и не повторяют - это сделано один раз, чтобы было понятно, что откуда.
Похожие вопросы
Предмет: Математика,
автор: petkovivan1273
Предмет: Қазақ тiлi,
автор: adiaask44
Предмет: Русский язык,
автор: Аноним
Предмет: Биология,
автор: LoLiTkA12