Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите - едет крыша. Ааааа!!!!! 0.5 < 0.5 ???? как это может быть? 
:(
    Опции темы
Bes
Дата 1.3.2005, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 806
Регистрация: 8.12.2004

Репутация: 5
Всего: 7



Долго искал ошибку в программе наконец нашел и офигел. smile
программа делает некоторые вычисления и в процедурке неправильно вычисляет вот процедура:

Код

Result:=2*Gam*Ksi*Kap/(sqr(Gam)-sqr(Xv));
if xv<S then
Result:=Result-Kap*p/S; // здесь ставлю брекпоинт


вижу что
xv = 0.5
S = 0.5
однако программа входит в условие и выполняет строчку
Result:=Result-Kap*p/S;

КАК ЭТО МОЖЕТ БЫТЬ?
ЧТО ТЕПЕРЬ НЕЛЬЗЯ ПОЛЬЗОВАТЬСЯ УСЛОВИЕМ < ?
Выручайте, а то у меня пошатнулась уверенность в том, что я делаю и вообще в программировании...... smile
PM MAIL   Вверх
Alex
Дата 1.3.2005, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 80
Всего: 162



Значения xv и S, откуда берутся? Они рассчитываются или вводятся пользователем?


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
~FoX~
Дата 1.3.2005, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 13
Всего: 68



Bes
Покажи всю процедуру и как её вызываешь.


Это сообщение отредактировал(а) ~FoX~ - 1.3.2005, 09:59


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
Dimich
Дата 1.3.2005, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 25.8.2004
Где: Брянск

Репутация: 1
Всего: 7



Такое поведение дробных чисел в программе вполне объяснимо, хотя человека может ввести в ступор. Чтобы понять, почему так происходит, почитай эту статью: http://delphi.olympus.ru/dk/helloword/reals.htm
--------------------
Не работает - исправь, работает - не трогай!!!
PM MAIL ICQ Jabber   Вверх
Bes
Дата 1.3.2005, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 806
Регистрация: 8.12.2004

Репутация: 5
Всего: 7



2~FoX~:

function TForm1.GetVR: real;
begin
{Result:=2*Gam*Ksi*Kap/(sqr(Gam)-sqr(Xv));
if xv<S then
Result:=Result-Kap*p/S; }
Result:=2*Gam*Ksi*Kap/(sqr(Gam)-sqr(Xv));
if xv<S then
Result:=Result-Kap*p/S;
end;

вызваю так
RVerh:=GetVR;

2Alex:
фишка в том, что когда вводится пользователем - то все нормально, а когда вычисляется:

Кусок кода (по сути перебор - весь диапазон значений делится на 5 часткей и для каждого расчитывается значение ф-ии)
Yv:=0.7-(2.1-0.7)/4;
Repeat
Yv:=Yv+(2.1-0.7)/4;

D:=1.4+(1.4-0.4)/4;
Repeat
D:=D-(1.4-0.4)/4;

Yn:=Yv+D;

Xv:=Yv/D;//здесь вычисляется х и S далее таким же образом
Xn:=Xv+1;
PM MAIL   Вверх
Akina
Дата 1.3.2005, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: нет
Всего: 454



0.5 может быть и 0.50000000001, и 0.49999999999 - есссно они не равны...


Цитата(Bes @ 1.3.2005, 10:38)
вижу что
xv = 0.5
S = 0.5
однако программа входит в условие и выполняет строчку
Result:=Result-Kap*p/S;

Сделай следующее:

Код

Result:=2*Gam*Ksi*Kap/(sqr(Gam)-sqr(Xv));
Temp=xv-S;
if Temp<>0 then
Result:=Result-Kap*p/S; // вот тут поставь брейкпойнт и посмотри значение переменной Temp



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Dimich
Дата 1.3.2005, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 25.8.2004
Где: Брянск

Репутация: 1
Всего: 7



Цитата(Akina @ 1.3.2005, 11:53)
if Temp<>0 then
по всей видимости получится то же самое, ведь Temp может быть и 0.00000001 например. Дело во внутреннем представлении вещественных чисел. В дебагере то будет "0" показываться, но при побитовом сравнении этот "0" <> 0
Может лучше так:
Код
Result:=2*Gam*Ksi*Kap/(sqr(Gam)-sqr(Xv));
Temp=xv-S;
if Abs (Temp)>0.0001 then // тут задается точность сравнения
Result:=Result-Kap*p/S;

--------------------
Не работает - исправь, работает - не трогай!!!
PM MAIL ICQ Jabber   Вверх
Girder
Дата 1.3.2005, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 31
Всего: 155



Dimich имхо: if Abs (Temp)>1e-15 then ...


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Dimich
Дата 1.3.2005, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 25.8.2004
Где: Брянск

Репутация: 1
Всего: 7



Цитата(Girder @ 1.3.2005, 12:12)
Dimich имхо: if Abs (Temp)>1e-15 then ...
согласен. Дельное замечание. Я не задался сразу этой мыслью, просто показал, в каком направлении копать smile
--------------------
Не работает - исправь, работает - не трогай!!!
PM MAIL ICQ Jabber   Вверх
Akina
Дата 1.3.2005, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: нет
Всего: 454



Цитата(Dimich @ 1.3.2005, 13:03)
В дебагере то будет "0" показываться

Что-то мне сомнительно... не может быть дебаггер настолько крив...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Bes
Дата 1.3.2005, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 806
Регистрация: 8.12.2004

Репутация: 5
Всего: 7



Может. :-( Причем когда как, не могу найти закономерность.
Проблема ВРОДЕ БЫ решилась когда поменял реал на екстендед, но подозреваю, что это в частном случае, а т.к. вычислений несколько десятков тысяч, то видимо придется переделать на АБС, (см. Димыч, Girder)
Просто я недоумеваю, неужели придется отказаться от операторов сравнения и воизбежания косяков поменять все условия в программе на АБС?

Это сообщение отредактировал(а) Bes - 1.3.2005, 13:04
PM MAIL   Вверх
Dimich
Дата 1.3.2005, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 25.8.2004
Где: Брянск

Репутация: 1
Всего: 7



Ребята, Вы почитайте статью, котрую я давал выше и поймете в чем состоит фича при сравнении вещественных чисел. Дебагер то показывает в принципе верно (число видно с точки зрения человека), а если рассматривать внутреннее представление числа, что происходит при сравнении (данные сравниваются то побитово)....... В общем, не поленитесь, достаточно интересно! Сразу все сомнения и неясности пропадут.
--------------------
Не работает - исправь, работает - не трогай!!!
PM MAIL ICQ Jabber   Вверх
Bes
Дата 1.3.2005, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 806
Регистрация: 8.12.2004

Репутация: 5
Всего: 7



2Dimich:
Я посмотрел так, бегло, поскольку времени совсем не остается, в принципе эту подлость я и подозревал, только как ее лечить. Т.е. представления чисел в машинном виде - это конечно все хорошо, а как работать -то?
PM MAIL   Вверх
Akina
Дата 1.3.2005, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: нет
Всего: 454



Цитата(Bes @ 1.3.2005, 14:03)
Может. :-( Причем когда как, не могу найти закономерность.

не понимаю... значит это бага дебаггера.
Вычитаем, получаем НЕ НОЛЬ. Это может быть корректное число (тогда дебаггер должен показать бы его) либо нечто некорректное (но тогда должно возникнуть исключение сопроцессора) - т.е. по-любому ненулёвость должна быть озвучена...

Цитата(Dimich @ 1.3.2005, 14:15)
Дебагер то показывает в принципе верно (число видно с точки зрения человека),

ни хрена не верно. он должен показывать что есть, а не то что по его мнению я хочу (или не хочу) увидеть... впрочем M$ любит за нас думать... мать... мать...

Цитата(Dimich @ 1.3.2005, 14:15)
Вы почитайте статью, котрую я давал выше и поймете в чем состоит фича при сравнении вещественных чисел.

да со сравнением-то все ясно... неясно с результатом вычитания...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0633 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.