Pascal. Как обойти ошибку? Вычисление arcsin
Дан диапазон от xn до xk (|x|<=1) Вводится шаг. При попытке вычислить последний шаг возникает ошибка.
program ddd;
var xn,xk,h :real;
i,n: integer;
function arcsin(x:real):real;
begin
if x=1 then arcsin:=pi/2
else if x=-1 then arcsin:=-pi/2
else arcsin:=arctan(x/sqrt(1-sqr(x)))
end;
begin
writeln('xn,xk');
readln(xn,xk);
writeln('h');
readln(h);
n:=round((xk-xn)/h);
for i:=0 to n do
begin
writeln('x=', xn:2:1,' arcsin(xn)',arcsin(xn):8:5);
xn:=xn+h;
end;
readln;
end.
при вводе х 0 1
h 0.1
программа вылетает с ошибкой.
при повторном запуске видно это:
xn,xk
0 1
h
0.1
x=0.0 arcsin(xn) 0.00000
x=0.1 arcsin(xn) 0.10017
x=0.2 arcsin(xn) 0.20136
x=0.3 arcsin(xn) 0.30469
x=0.4 arcsin(xn) 0.41152
x=0.5 arcsin(xn) 0.52360
x=0.6 arcsin(xn) 0.64350
x=0.7 arcsin(xn) 0.77540
x=0.8 arcsin(xn) 0.92730
x=0.9 arcsin(xn) 1.11977
x=1.0 arcsin(xn)Runtime error 207 at 0391:0004.
xn,xk
Как это можно обойти?
(Данный код - смысловая часть более сложной программы)
Вот немного другие цифры:
от 0.6 до 1 с шагом 0.1
x=0.6 arcsin(xn) 0.64350
x=0.7 arcsin(xn) 0.77540
x=0.8 arcsin(xn) 0.92730
x=0.9 arcsin(xn) 1.11977
x=1.0 arcsin(xn)Runtime error 207 at 0330:0004.
от 0.7 до 1 с шагом 0.1
x=0.7 arcsin(xn) 0.77540
x=0.8 arcsin(xn) 0.92730
x=0.9 arcsin(xn) 1.11977
x=1.0 arcsin(xn) 1.57080
Почему тут работает?
(и от 0.8 ...1 тоже)
Проблема в строчке:
else arcsin:=arctan(x/sqrt(1-sqr(x)))
Тут происходит деление на ноль, когда х=1.0
Решается так:
function arcsin(x:real):real;
begin
if x=1.0 then arcsin:=pi/2 // x:real, поэтому и сравнивать надо с 1.0, а не с 1
else if x=-1.0 then arcsin:=-pi/2 //аналогично