Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
2-1219219486
sD
2008-08-20 12:04
2008.09.28
Работа с dxBarManager (DevExpress)


2-1218330125
aaaaa
2008-08-10 05:02
2008.09.28
Drag&amp;Drop


2-1219062308
Сталкер
2008-08-18 16:25
2008.09.28
Выбор из справочника


2-1219139868
pushkin42
2008-08-19 13:57
2008.09.28
Ошибка при выполнении запроса SQL


4-1197104970
Nil
2007-12-08 12:09
2008.09.28
Прозрачность части окна