Текущий архив: 2008.09.28;
Скачать: CL | DM;
Вниз
Ошибка компиллятора? Найти похожие ветки
← →
AlexDan © (2008-08-18 21:45) [0]При нажатии (выборе) CheckBox переменная rpr проинимает знач. 0.4, но в if кнопки Button1 почему-то к 0.4 не приравнивается (почему-то уходит в условие else) ..
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
if rpr=0.4 then
begin
if frac(cha/0.4)=0 then
begin
pr1:=cha/0.4-1;
end
else
begin
pr1:=round(cha/0.4);
end;
cd60:=pr1*chb{+perem*1.2};
end
else
begin
cd60:=pr1*chb{+perem*1.2};
end;
end;
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
if CheckBox1.Checked then
begin rpr:=0.4;
{Edit2.text:=inttostr(klkrab);}
end
else
begin rpr:=0;
end;
end;
← →
Сергей М. © (2008-08-18 21:47) [1]
> переменная rpr проинимает знач. 0.4
Верь глазам своим.
← →
Германн © (2008-08-18 21:48) [2]
> if rpr=0.4 then
Ну сколько надо повторять, что нельзя сравнивать нецелые числа на точное равенство.
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=374
← →
Desdechado © (2008-08-18 21:50) [3]Дробные числа нельзя сравнивать на точное соответствие из-за особенностей их машинного представления. Это нужно делать, например, так:
if Abs(rpr-0.4)<0.00001 then
Читать статью на Королевстве Дельфи.
← →
AlexDan © (2008-08-18 21:55) [4]Нужно при пуске компилл. предупреждение писать, а то у меня программу два дня глючило, пока я ошибку нашёл..
> Сергей М.
О Козьме Пруткове я тоже в первую очередь подумал..)
← →
Сергей М. © (2008-08-18 21:57) [5]
> Нужно при пуске компилл. предупреждение писать, а то у меня
> программу два дня глючило, пока я ошибку нашёл
Нужно гуглить и докум-цию читать, а то мастаков от таких вопросов постоянно глючит)
← →
Сергей М. © (2008-08-18 21:58) [6]
> Нужно при пуске компилл
Чаво-чавоооо ?!?
← →
AlexDan © (2008-08-18 21:59) [7]> Германн © (18.08.08 21:48) [2]
О проблеммах с нецелыми числами я наслышан, удивило то, что описаны-то они были внутри компиллятора (т.е. без мат. действий), и совершенно одинаково..
← →
AlexDan © (2008-08-18 22:01) [8]> AlexDan © (18.08.08 21:59) [7]
я имел в виду в коде непосредственно, без действий, так или иначе, связанных с округлением.
← →
Сергей М. © (2008-08-18 22:06) [9]
> описаны-то они были внутри компиллятора
О боже ..
Час от часу не легче) ..
← →
Сергей М. © (2008-08-18 22:08) [10]
> в коде непосредственно, без действий, так или иначе, связанных
> с округлением
ты с отладчиком знаком ? Дружишь ?
← →
AlexDan © (2008-08-18 22:10) [11]> Сергей М. © (18.08.08 22:08) [10]
При пошаговой отладке эту красоту и обнаружил.
← →
Loginov Dmitry © (2008-08-18 22:12) [12]> О проблеммах с нецелыми числами я наслышан, удивило то,
> что описаны-то они были внутри компиллятора (т.е. без мат.
> действий), и совершенно одинаково..
Ниче из этого не понял :( Вместоif rpr=0.4 then
наряду с [3] можно использовать библиотечную функцию Math.SameValue().
← →
Сергей М. © (2008-08-18 22:19) [13]
> При пошаговой отладке эту красоту и обнаружил
Ты обнаружил следствие.
А причину ты не обнаружил.
Отладчик - не новые ворота, а руководство)
← →
AlexDan © (2008-08-18 22:22) [14]> Desdechado © (18.08.08 21:50) [3]
> Сергей М. © (18.08.08 21:47) [1]
Вообщемто, я эту тему вёл к тому, что переменные (rpr) приравнивались к 0,4, непосредственно в коде, т.е. внешне, именно на глаз rpr:=0.4, и в то же время rpr<>0.4.;))
← →
AlexDan © (2008-08-18 22:24) [15]Т.е. условие было задано очень жёстко.)
← →
Сергей М. © (2008-08-18 22:29) [16]
> на глаз
Какой еще нафих "глаз" ?
Ты статью-то прочитал в [2] ?
Вник ? Выводы сделал ?
← →
AlexDan © (2008-08-18 22:37) [17]Это скорее камень в огород разработчиков.. Ведь код-то [1] написан идеально правильно, а от компилятора (отладчика) никаких предупреждений, что-то вроде 0,4 (!??):))).
← →
Loginov Dmitry © (2008-08-18 22:44) [18]> Это скорее камень в огород разработчиков.. Ведь код-то [1]
> написан идеально правильно, а от компилятора (отладчика)
> никаких предупреждений, что-то вроде 0,4 (!??)
Чего хочешь от компилятора? Так он сделан, принимай как есть. Ссылки из [2] достаточно для осознания логики. Как правильно сравнивать вещественные числа - уже сказано. Непонятно, что еще не устраивает, и к чему спор?
← →
Сергей М. © (2008-08-18 22:44) [19]
> код-то [1] написан идеально правильно
А мужики-то и не знают)
> от компилятора (отладчика) никаких предупреждений
Отладчик не обязан тебя ни о чем предупреждать - он расчитан на твои мозги.
А компилятору неведомо значение переменной rpr на момент компиляции - переменная эта получит значение в ран-тайм.
← →
AlexDan © (2008-08-18 22:49) [20]> Сергей М. © (18.08.08 22:44) [19]
> Отладчик не обязан тебя ни о чем предупреждать - он расчитан
> на твои мозги.
Ничего себе, не должен, значит Борланд на мерсе ездит, (условно), (вроде как я ему платил), а потом моя программа, написанная с точки зрения Борланда правильно (т.к. без проблемм откомпил.), начинает исподтишка привирать, и это-то при инжинерных расчётах..! ))
← →
Юрий Зотов © (2008-08-18 22:52) [21]> AlexDan © (18.08.08 22:37) [17]
> Это скорее камень в огород разработчиков.. Ведь код-то [1] написан
> идеально правильно, а от компилятора (отладчика) никаких
> предупреждений, что-то вроде 0,4 (!??):))).
А какое конкретно предупреждение Вы хотели бы получить? О том, что числа в машине хранятся в двоичном виде и имеют ограниченную разрядную сетку?
Так в программировании это элементарная детская азбука. И разработчики компилятора вполне обоснованно предполагали, что раз уж человек садится программировать, то хотя бы с азбукой он должен быть знаком.
← →
Сергей М. © (2008-08-18 22:52) [22]
> моя программа, написанная с точки зрения Борланда правильно
> (т.к. без проблемм откомпил.)
Нет, не правильно, ни с какой точки зрения.
← →
Сергей М. © (2008-08-18 22:53) [23]
> Борланд на мерсе ездит, (условно), (вроде как я ему платил)
Детский сад - штаны на лямках)
← →
AlexDan © (2008-08-18 22:54) [24]И самое главное
> Сергей М. © (18.08.08 22:44) [19]
> А компилятору неведомо значение переменной rpr на момент
> компиляции
Значение rpr известно, я его сам описал rpr:=0.4, и сравнивал тоже с чётко описанным значением if rpr = 0.4. Смотрите код..
← →
Сергей М. © (2008-08-18 22:56) [25]
> я его сам описал rpr:=0.4
> Смотрите код..
Вылупился.
Не вижу в упор.
Мартышка к старости ?
← →
Сергей М. © (2008-08-18 23:03) [26]А, вижу)
Ну точно мартышка)
Делай раз:
const xxx = 0.4;
Делай два:
rpr := xxx;
Делай три:
if rpr = xxx then ...
Что говорит отладчик ?
← →
AlexDan © (2008-08-18 23:09) [27]А rpr(real) нельзя приравнивать к const..
← →
Юрий Зотов © (2008-08-18 23:10) [28]Серег, совет - не трать время. В суть проблемы человек въехать как следует не пожелал, элементарных вещей не знает, и даже то, что присвоение происходит в одном методе, а проверка в другом, а между ними может быть вызвано еще что угодно, и компилятор вдруг должен каким-то волшебным образом отследить логику кода - даже этого человек не понимает. Виноваты компилятор и Борланд.
← →
Anatoly Podgoretsky © (2008-08-18 23:11) [29]> AlexDan (18.08.2008 21:45:00) [0]
Нет никакой ошибки компилятора, он работает правильно.
← →
AlexDan © (2008-08-18 23:13) [30]> Юрий Зотов © (18.08.08 23:10) [28]
Всё он прекрасно понимает(.. Просто описано всё было чётко..rpr:=0.4 и if rpr = 0.4 я имею в виду визуально.
← →
AlexDan © (2008-08-18 23:15) [31]> Юрий Зотов © (18.08.08 23:10) [28]
Значит и ответ по идее должен быть однозначным..
← →
Юрий Зотов © (2008-08-18 23:17) [32]> AlexDan © (18.08.08 23:15) [31]
Он и есть однозначный. Только не тот, который Вам мог бы понравиться.
← →
AlexDan © (2008-08-18 23:18) [33]Представляете, поваренная книга: берёте 1 кг сахара смешиваете с 1 кг ягод и 2.5 кг варенья разливаете по банкам..))
← →
{RASkov} © (2008-08-18 23:26) [34]> [33] AlexDan © (18.08.08 23:18)
Зачем ты себе и всем запутываешь моск?)
Да, тут есть этот "косяк", и вместо того, что бы понять его и запомнить, ты пытаешься всех и во всем обвинить, зачем?
Только косяка-то и нет....)
← →
Сергей М. © (2008-08-18 23:27) [35]
> AlexDan © (18.08.08 23:18) [33]
> берёте 1 кг сахара смешиваете с 1 кг ягод и 2.5 кг варенья
> разливаете по банкам
Можно получить 2,5 кг ягод с сахаром.
А можно и 2 кг. г..на.
От "повара" зависит)
← →
Юрий Зотов © (2008-08-18 23:29) [36]> {RASkov} © (18.08.08 23:26) [34]
Нет тут никакого косяка. Кроме закосяченного программистом.
← →
{RASkov} © (2008-08-18 23:30) [37]> [36] Юрий Зотов © (18.08.08 23:29)
> > {RASkov} © (18.08.08 23:26) [34]
>
> Нет тут никакого косяка.
А кто говорил, что есть? :)
← →
Сергей М. © (2008-08-18 23:33) [38]
> AlexDan © (18.08.08 23:18) [33]
Ну так ты сделал телодвижения на "раз-два-три" ?)
Или будешь продолжать упираться ?)
← →
Сергей М. © (2008-08-18 23:39) [39]
> Юрий Зотов © (18.08.08 23:10) [28]
>
> не трать время
Внял.
Ушел)
← →
Renegat © (2008-08-18 23:56) [40]2 AlexDan:
Как известно, любые числа, будь то целые или дробные, хранятся в компе в виде последовательностей битов, т.е. разрядов двоичной системы счисления. Так вот, судя по Вашей анкете Вы должны быть наслышаны о переводе чисел одной системы счисления в другую. Так вот, чтобы зашифровать дробное десятичное число, его нужно представить дробным двоичным.
Попробуем это сделать с 0.4 - и с удивлением обнаружим, что 4/10 = 2/5.
Такая (пятеричная) дробь по определению не может быть представлена в виде конечной двоичной - только как периодическая!
Так вот, к чему я клоню.
Существуют разные форматы представления не-целых чисел: REAL4(Single), REAL8(Double) и REAL10(Extended). И у каждого из этих типов мантисса имеет разную длину. И в итоге, когда получилость, скажем, двоичная дробь 0.(1101) то в разных типах она будет выглядеть (условно) какSingle: 0.1101
Double: 0.11011101
Extended:0.110111011101
Вещественные константы, если меня память не подводит, хранятся в Паскале как Extended. А тип вашей переменной, скорее всего, Single или Double.
[+]: Более того, не стоит сбрасывать со счетов и погрешности округления при вычислениях! В результате них даже сравнение равных по размеру типов обернётся дохлым номером...
В итоге получаем правило, которое стотыщ раз уже твердили миру (только ему всё ещё упрямо не хотят доверять):
Никогда не проводите точное сравнение вещественных!!!
ЗЫ: +1 к Сергею.
Страницы: 1 2 вся ветка
Текущий архив: 2008.09.28;
Скачать: CL | DM;
Память: 0.57 MB
Время: 0.028 c