![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка компиллятора? [D7, XP]
AlexDan © (2008-08-18 21:45:00)При нажатии (выборе) 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-19 01:01:00) [1]
> Юрий Зотов © (18.08.08 23:10) [28]
>
> Серег, совет - не трать время.
+1
Сей автор уже давно тут известен как троешник не желающий учиться. И в этом посте он это подтвердил ещё раз.
Amoeba (2008-08-19 00:41:00) [2]
> Renegat © (18.08.08 23:56) [40]
А стоит ли метать бисер?
Renegat (2008-08-18 23:56:00) [3]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 к Сергею.
Сергей М. (2008-08-18 23:39:00) [4]
> Юрий Зотов © (18.08.08 23:10) [28]
>
> не трать время
Внял.
Ушел)
Сергей М. (2008-08-18 23:33:00) [5]
> AlexDan © (18.08.08 23:18) [33]
Ну так ты сделал телодвижения на "раз-два-три" ?)
Или будешь продолжать упираться ?)
{RASkov} (2008-08-18 23:30:00) [6]> [36] Юрий Зотов © (18.08.08 23:29)
> > {RASkov} © (18.08.08 23:26) [34]
>
> Нет тут никакого косяка.
А кто говорил, что есть? :)
Юрий Зотов (2008-08-18 23:29:00) [7]> {RASkov} © (18.08.08 23:26) [34]
Нет тут никакого косяка. Кроме закосяченного программистом.
Сергей М. (2008-08-18 23:27:00) [8]
> AlexDan © (18.08.08 23:18) [33]
> берёте 1 кг сахара смешиваете с 1 кг ягод и 2.5 кг варенья
> разливаете по банкам
Можно получить 2,5 кг ягод с сахаром.
А можно и 2 кг. г..на.
От "повара" зависит)
{RASkov} (2008-08-18 23:26:00) [9]> [33] AlexDan © (18.08.08 23:18)
Зачем ты себе и всем запутываешь моск?)
Да, тут есть этот "косяк", и вместо того, что бы понять его и запомнить, ты пытаешься всех и во всем обвинить, зачем?
Только косяка-то и нет....)
AlexDan (2008-08-18 23:18:00) [10]Представляете, поваренная книга: берёте 1 кг сахара смешиваете с 1 кг ягод и 2.5 кг варенья разливаете по банкам..))
Юрий Зотов (2008-08-18 23:17:00) [11]> AlexDan © (18.08.08 23:15) [31]
Он и есть однозначный. Только не тот, который Вам мог бы понравиться.
AlexDan (2008-08-18 23:15:00) [12]> Юрий Зотов © (18.08.08 23:10) [28]
Значит и ответ по идее должен быть однозначным..
AlexDan (2008-08-18 23:13:00) [13]> Юрий Зотов © (18.08.08 23:10) [28]
Всё он прекрасно понимает(.. Просто описано всё было чётко..rpr:=0.4 и if rpr = 0.4 я имею в виду визуально.
Anatoly Podgoretsky (2008-08-18 23:11:00) [14]> AlexDan (18.08.2008 21:45:00) [0]
Нет никакой ошибки компилятора, он работает правильно.
Юрий Зотов (2008-08-18 23:10:00) [15]Серег, совет - не трать время. В суть проблемы человек въехать как следует не пожелал, элементарных вещей не знает, и даже то, что присвоение происходит в одном методе, а проверка в другом, а между ними может быть вызвано еще что угодно, и компилятор вдруг должен каким-то волшебным образом отследить логику кода - даже этого человек не понимает. Виноваты компилятор и Борланд.
AlexDan (2008-08-18 23:09:00) [16]А rpr(real) нельзя приравнивать к const..
Сергей М. (2008-08-18 23:03:00) [17]А, вижу)
Ну точно мартышка)
Делай раз:
const xxx = 0.4;
Делай два:
rpr := xxx;
Делай три:
if rpr = xxx then ...
Что говорит отладчик ?
Сергей М. (2008-08-18 22:56:00) [18]
> я его сам описал rpr:=0.4
> Смотрите код..
Вылупился.
Не вижу в упор.
Мартышка к старости ?
AlexDan (2008-08-18 22:54:00) [19]И самое главное
> Сергей М. © (18.08.08 22:44) [19]
> А компилятору неведомо значение переменной rpr на момент
> компиляции
Значение rpr известно, я его сам описалrpr:=0.4, и сравнивал тожес чётко описанным значением if rpr = 0.4. Смотрите код..
Сергей М. (2008-08-18 22:53:00) [20]
> Борланд на мерсе ездит, (условно), (вроде как я ему платил)
Детский сад - штаны на лямках)