![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Bes |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 806 Регистрация: 8.12.2004 Репутация: 5 Всего: 7 |
Долго искал ошибку в программе наконец нашел и офигел.
программа делает некоторые вычисления и в процедурке неправильно вычисляет вот процедура:
вижу что xv = 0.5 S = 0.5 однако программа входит в условие и выполняет строчку Result:=Result-Kap*p/S; КАК ЭТО МОЖЕТ БЫТЬ? ЧТО ТЕПЕРЬ НЕЛЬЗЯ ПОЛЬЗОВАТЬСЯ УСЛОВИЕМ < ? Выручайте, а то у меня пошатнулась уверенность в том, что я делаю и вообще в программировании...... |
|||
|
||||
| Alex |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4147 Регистрация: 25.3.2002 Где: Москва Репутация: 80 Всего: 162 |
Значения xv и S, откуда берутся? Они рассчитываются или вводятся пользователем?
-------------------- Написать можно все - главное четко представлять, что ты хочешь получить в конце. |
|||
|
||||
| ~FoX~ |
|
|||
![]() НЕ рыжий!!! ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2819 Регистрация: 8.10.2003 Где: Зеленоград Репутация: 13 Всего: 68 |
Bes
Покажи всю процедуру и как её вызываешь. Это сообщение отредактировал(а) ~FoX~ - 1.3.2005, 09:59 |
|||
|
||||
| Dimich |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 247 Регистрация: 25.8.2004 Где: Брянск Репутация: 1 Всего: 7 |
Такое поведение дробных чисел в программе вполне объяснимо, хотя человека может ввести в ступор. Чтобы понять, почему так происходит, почитай эту статью: http://delphi.olympus.ru/dk/helloword/reals.htm
--------------------
Не работает - исправь, работает - не трогай!!! |
|||
|
||||
| Bes |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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; |
|||
|
||||
| Akina |
|
||||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: нет Всего: 454 |
0.5 может быть и 0.50000000001, и 0.49999999999 - есссно они не равны...
Сделай следующее:
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
||||
|
|||||
| Dimich |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 247 Регистрация: 25.8.2004 Где: Брянск Репутация: 1 Всего: 7 |
Может лучше так:
--------------------
Не работает - исправь, работает - не трогай!!! |
||||
|
|||||
| Girder |
|
|||
![]() Лентяй 2 ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1993 Регистрация: 12.5.2004 Репутация: 31 Всего: 155 |
Dimich имхо: if Abs (Temp)>1e-15 then ...
-------------------- Как слышим, так и пишим. Истина где-то там... |
|||
|
||||
| Dimich |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 247 Регистрация: 25.8.2004 Где: Брянск Репутация: 1 Всего: 7 |
--------------------
Не работает - исправь, работает - не трогай!!! |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: нет Всего: 454 |
Что-то мне сомнительно... не может быть дебаггер настолько крив... -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Bes |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 806 Регистрация: 8.12.2004 Репутация: 5 Всего: 7 |
Может. :-( Причем когда как, не могу найти закономерность.
Проблема ВРОДЕ БЫ решилась когда поменял реал на екстендед, но подозреваю, что это в частном случае, а т.к. вычислений несколько десятков тысяч, то видимо придется переделать на АБС, (см. Димыч, Girder) Просто я недоумеваю, неужели придется отказаться от операторов сравнения и воизбежания косяков поменять все условия в программе на АБС? Это сообщение отредактировал(а) Bes - 1.3.2005, 13:04 |
|||
|
||||
| Dimich |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 247 Регистрация: 25.8.2004 Где: Брянск Репутация: 1 Всего: 7 |
Ребята, Вы почитайте статью, котрую я давал выше и поймете в чем состоит фича при сравнении вещественных чисел. Дебагер то показывает в принципе верно (число видно с точки зрения человека), а если рассматривать внутреннее представление числа, что происходит при сравнении (данные сравниваются то побитово)....... В общем, не поленитесь, достаточно интересно! Сразу все сомнения и неясности пропадут.
--------------------
Не работает - исправь, работает - не трогай!!! |
|||
|
||||
| Bes |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 806 Регистрация: 8.12.2004 Репутация: 5 Всего: 7 |
2Dimich:
Я посмотрел так, бегло, поскольку времени совсем не остается, в принципе эту подлость я и подозревал, только как ее лечить. Т.е. представления чисел в машинном виде - это конечно все хорошо, а как работать -то? |
|||
|
||||
| Akina |
|
||||||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: нет Всего: 454 |
не понимаю... значит это бага дебаггера. Вычитаем, получаем НЕ НОЛЬ. Это может быть корректное число (тогда дебаггер должен показать бы его) либо нечто некорректное (но тогда должно возникнуть исключение сопроцессора) - т.е. по-любому ненулёвость должна быть озвучена...
ни хрена не верно. он должен показывать что есть, а не то что по его мнению я хочу (или не хочу) увидеть... впрочем M$ любит за нас думать... мать... мать...
да со сравнением-то все ясно... неясно с результатом вычитания... -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
||||||
|
|||||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |