Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.11.2012, 18:18
reizer reizer вне форума
Прохожий
 
Регистрация: 14.11.2012
Сообщения: 4
Репутация: 10
По умолчанию sqrt и extended

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  
Старый 14.11.2012, 18:54
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Нифига не понятно.
Что надо сделать то?
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #3  
Старый 14.11.2012, 21:11
reizer reizer вне форума
Прохожий
 
Регистрация: 14.11.2012
Сообщения: 4
Репутация: 10
По умолчанию

нужно понять куда деваются значения локальных переменных, напримере расчета квадратного корня, т.е. когда проверяется переменная "d" по идее она должна равняться корню квадратному от 49 т.е. 7, но условие не выполняется так как "d" якобы не равно 7.
Ответить с цитированием
  #4  
Старый 14.11.2012, 21:33
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Дак это локальные переменные, при заходе в процедуру они могут имет произвольные значения. Локальные переменные в стеке хранятся.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #5  
Старый 14.11.2012, 22:33
Аватар для v1s2222
v1s2222 v1s2222 вне форума
Продвинутый
 
Регистрация: 07.09.2010
Сообщения: 726
Репутация: 26711
По умолчанию

Просто округляй (или отбрасывай дробную часть):
Код:
var
d3: extended;
d: integer;
begin
    d3:=49;
    d := trunc(sqrt(d3));
    if d=7 then
      begin
        d3:=50;
      end;

Тогда обработка всегда будет правильной.
__________________
Помогаю за Спасибо
Ответить с цитированием
  #6  
Старый 14.11.2012, 22:34
reizer reizer вне форума
Прохожий
 
Регистрация: 14.11.2012
Сообщения: 4
Репутация: 10
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
Дак это локальные переменные, при заходе в процедуру они могут имет произвольные значения. Локальные переменные в стеке хранятся.

разница в том что проверка переменной идет после того как в нее заносится расчет квадратного корня.
Можно сделать вывод что локальные переменные процедуры №1 обнуляются(или принимают другое случайное значение) даже если из этой процедуры №1 вызывается какая-либо другая подфункция или подпроцедура допустип №2 (в нашем случае это sqrt()).
Если использовать трассировку и посмотреть какое значение будет принимать переменная до условия и после, то оно будет равняться 7, в нашем случае. Но условие, повторюсь, не выполняется.

Последний раз редактировалось reizer, 14.11.2012 в 22:39.
Ответить с цитированием
  #7  
Старый 14.11.2012, 22:37
Аватар для v1s2222
v1s2222 v1s2222 вне форума
Продвинутый
 
Регистрация: 07.09.2010
Сообщения: 726
Репутация: 26711
По умолчанию

Потому что (как я уже отвечал выше), корень квадратный некогда целому числу не равнялся, т.е. sqrt(49) <> 7! Отбрасывай дробную часть и сравнивай.
__________________
Помогаю за Спасибо
Ответить с цитированием
Этот пользователь сказал Спасибо v1s2222 за это полезное сообщение:
reizer (14.11.2012)
  #8  
Старый 14.11.2012, 22:41
reizer reizer вне форума
Прохожий
 
Регистрация: 14.11.2012
Сообщения: 4
Репутация: 10
По умолчанию

Цитата:
Сообщение от v1s2222
Потому что (как я уже отвечал выше), корень квадратный некогда целому числу не равнялся, т.е. sqrt(49) <> 7! Отбрасывай дробную часть и сравнивай.

ясно, спасибо, как всегда недосмотрел )
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:48.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025