![]() |
|
#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
|
||||
|
||||
![]() Нифига не понятно.
Что надо сделать то? — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#3
|
|||
|
|||
![]() нужно понять куда деваются значения локальных переменных, напримере расчета квадратного корня, т.е. когда проверяется переменная "d" по идее она должна равняться корню квадратному от 49 т.е. 7, но условие не выполняется так как "d" якобы не равно 7.
|
#4
|
||||
|
||||
![]() Дак это локальные переменные, при заходе в процедуру они могут имет произвольные значения. Локальные переменные в стеке хранятся.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#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
|
|||
|
|||
![]() Цитата:
ясно, спасибо, как всегда недосмотрел ) |