![]() |
|
|
#1
|
|||
|
|||
|
delphi XE
возникло затруднение с расчетом квадратного корня )) , вообщем код такой Код:
var
d, d3: extended;
begin
d3:=49;
d := sqrt(d3);
if d=7 then
begin
d3:=50;
end;
end;бывает получается после расчета квадратного корня, что d<>7, а если d=7, то d3<>50 . хм. пока писал нашёл ответ. переменные были объявлены локально, объявив их глобально все стало на свои места. правда истинной причины не ведаю. |
|
#2
|
||||
|
||||
|
Нифига не понятно.
Что надо сделать то? |
|
#3
|
|||
|
|||
|
нужно понять куда деваются значения локальных переменных, напримере расчета квадратного корня, т.е. когда проверяется переменная "d" по идее она должна равняться корню квадратному от 49 т.е. 7, но условие не выполняется так как "d" якобы не равно 7.
|
|
#4
|
||||
|
||||
|
Дак это локальные переменные, при заходе в процедуру они могут имет произвольные значения. Локальные переменные в стеке хранятся.
|
|
#5
|
||||
|
||||
|
Просто округляй (или отбрасывай дробную часть):
Код:
var
d3: extended;
d: integer;
begin
d3:=49;
d := trunc(sqrt(d3));
if d=7 then
begin
d3:=50;
end;Тогда обработка всегда будет правильной. |
|
#6
|
|||
|
|||
|
Цитата:
разница в том что проверка переменной идет после того как в нее заносится расчет квадратного корня. Можно сделать вывод что локальные переменные процедуры №1 обнуляются(или принимают другое случайное значение) даже если из этой процедуры №1 вызывается какая-либо другая подфункция или подпроцедура допустип №2 (в нашем случае это sqrt()). Если использовать трассировку и посмотреть какое значение будет принимать переменная до условия и после, то оно будет равняться 7, в нашем случае. Но условие, повторюсь, не выполняется. Последний раз редактировалось reizer, 14.11.2012 в 22:39. |
|
#7
|
||||
|
||||
|
Потому что (как я уже отвечал выше), корень квадратный некогда целому числу не равнялся, т.е. sqrt(49) <> 7! Отбрасывай дробную часть и сравнивай.
|
| Этот пользователь сказал Спасибо v1s2222 за это полезное сообщение: | ||
reizer (14.11.2012)
| ||
|
#8
|
|||
|
|||
|
Цитата:
ясно, спасибо, как всегда недосмотрел ) |