![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Реал и матем. функции. [D7, XP]
AlexDan © (2009-03-10 19:39:00)Вот такое выражение равно 1-це.
chb:real; chb:=1.2;
abs(frac(chb/0.6))
Вроде должен быть 0?, насколько я понимаю..?.
korneley (2009-03-15 14:09:00) [1]
> Anatoly Podgoretsky © (15.03.09 13:10) [66]
> > Григорьев Антон © (15.03.09 12:21) [64] Ну и кто всех
> с толку сбил, кто написал статью так, что они теперь как
> огня боятся точного сравнения.
Да нормальная статья. Или, давайте, тогда уже и Дейкстре предъявы выставлять :)
> Григорьев Антон © (15.03.09 13:37) [67]
Напомнило фильм, "Всемирная история", Мэла Брукса. Выходит Моисей с тремя глиняными табличками: "Люди, я принес вам 15 заповедей!" Роняет одну, та - вдребезги. "Люди! Я принёс вам 10 заповедей!" :))
Григорьев Антон (2009-03-15 13:37:00) [2]
> Anatoly Podgoretsky © (15.03.09 13:10) [66]
> Ну и кто всех с толку сбил, кто написал статью так, что
> они теперь как огня боятся точного сравнения.
Дык, не писал я, что нельзя сравнивать вообще. Я писал о том, какие проблемы могут возникнуть, и полагал, что человек, разобравшийся с этим, сам поймёт, когда можно, а когда нельзя. Но многие предпочли сделать более простой вывод: "Низзя, и всё тут!"
Господь диктует Моисею Тору:- ... не вари козленка в молоке матери его...
Моисей:- O, погоди, минуточку... А-а-а-а, я понял! Это означает - не ешь мясного с молочным?!
Господь:- Hе фантазируй. Пиши, что говорят - не вари козленка в моло...
Моисей:- Aааа, сейчас, ага, все - понял: надо иметь отдельную посуду для мяса и молока!
Господь (раздраженно):- Послушай, что ты несешь? Я же тебе ясно сказал! Не выдумывай, пиши, что диктуют: не вари козлен...
Моисей:- Bсе, все, вот теперь - понял: после мясного надо подождать шесть часов, прежде чем есть молочное, а после молочного...
Господь (устало, махнув рукой):- Э, делайте, что хотите...
Anatoly Podgoretsky (2009-03-15 13:10:00) [3]
> Григорьев Антон © (15.03.09 12:21) [64]
Ну и кто всех с толку сбил, кто написал статью так, что они теперь как огня боятся точного сравнения.
palva (2009-03-15 12:51:00) [4]У меня был подобный случай. Правда процессор был другой - IBM370. Там при плавающих операциях могла случиться потеря точности (underflow) Это когда при вычитании очень близких чисел получался почти ноль. Поскольку разница у чисел была где-то в битах округления, то ненулевой результат не имел ни одного верного знака. Процессор считал это криминалом и ронял задачу. Мне пришлось вставить код, где я перед вычитанием проверял операнды и при их очень сильной близости присваивал результату машинный ноль. Вот такой результат я затем проверял на равенство нулю, чтобы принять решение, нужно ли продолжать итерации.
Григорьев Антон (2009-03-15 12:21:00) [5]
> Германн © (14.03.09 01:06) [42]
> Не представишь ли мне "реальный" пример программы, где можно
> использовать сравнение вещественного числа на "строгое"
> равенство с константой?
Долго объяснять суть, но в одной моей программе есть, например, код с таким смыслом:
var
X:Extended;
...
X := 0;
// Здесь идёт код, который, в зависимости от разных условий,
// либо записывает в X значение, гарантированно отличное от нуля,
// либо оставляет эту переменную без изменения
if X=0 then... // Вот оно, точное сравнение
Добавлю только, что это всё происходит не в одной процедуре, а в разных методах. Инициализация X нулём - в конструкторе (естестванно, неявная), код, который, возможно, изменит значение - в одном методе, код, который проверяет на равенство нулю - в другом.
Можно было бы, конечно, добавить булевский флаг, показывающий, вычислялось X или нет, но я не вижу смысла - тут и так всё корректно работает.
А вообще, когда я писал программы с большим количеством вещественных вычислений, то, помнится, не так уж мало было ситуаций, когда точное сравнение было вполне допустимо. Сейчас сходу не вспомню, в каких ситуациях, но было.
palva (2009-03-15 11:33:00) [6]Конечно, нужно сравнивать. Особенно это нужно автору. Если бы он перед тем, как задавать вопрос, сравнил...
var chb:real;
begin
// > Вот такое выражение равно 1-це.
chb:=1.2;
WriteLn(abs(frac(chb/0.6)) = 1.0); // FALSE
end.
то убедился бы, что выражение не равно единице. И вопрос бы сразу отпал.
Anatoly Podgoretsky (2009-03-15 08:35:00) [7]> Германн (14.03.2009 0:50:40) [40]
Я всю правду рассказал, а не смущал.
Можно сравнивать и нужно сравнивать, если нужно строгое сравнение.
AlexDan (2009-03-15 08:18:00) [8]> Германн © (15.03.09 03:06) [60]
ок)
Германн (2009-03-15 03:06:00) [9]
> AlexDan © (14.03.09 08:05) [55]
>
> > Германн © (14.03.09 02:46) [54]
> если это обо мне, то самое интересное, что понял я это очень
> давно). Так же я понял, что этого не понимают:Тын-Дын,и
> местами Григорьев Антон и Anatoly Podgoretsky. Т.е. 10%
> из присутствующих на ветк
Ты опять ничего не понял, очевидно, :(
И Тын-Дын и АП и, тем более Григорьев Антон это понимают!
Просто первые два "не хотят" меня понимать! Но хотят со мной спорить!
Ну жисть у них такая скушная, что без кулачного боя/или/ спора на ДМ им жизнь не интересна!
А третий слишком умный, чтобы "влезать"" Ну так он МИФИ'ст! :)
AndreyV (2009-03-14 10:45:00) [10]> [55] AlexDan © (14.03.09 08:05)
> > Германн © (14.03.09 02:46) [54]
> что говорит о том, что делфи использует
> какую-то подмазку, ориентируясь на ожидаемый ответ (для
> подавляющего большинства) :).
Ты предложенные статьи прочитал? Делфи пофиг, что ты там подставляешь. А запретить точное сравнение тебе никто не может, тем более Делфи и те 10%, которые "не понимают".
korneley (2009-03-14 09:32:00) [11]
> AlexDan © (14.03.09 08:23) [56]
Ну вот ещё здесь почитать можно (нужно)
http://ltwood.wikidot.com/float#toc14
korneley (2009-03-14 09:22:00) [12]
> Тын-Дын © (14.03.09 01:19) [45]
А давай немного изменим код:
a := 2.1/3;
b := a*3;
if b = 2.1 then ShowMessage('=') else ShowMessage('<>');
Пока что, единственный вариант разумного сравнения на равенство, приведённый в данной ветке, это [25]. И опять же это делается "с чувством, толком, расстановкой" (с) :) Т.е. человек знает, что, зачем и почему.
AlexDan (2009-03-14 08:23:00) [13]Прошу Григорьев Антон и Anatoly Podgoretsky не обижаться).а подмазка была видна в Тын-Дын © (14.03.09 01:19) [45], хотя это даже не подмазка, а 'подход работы' (корявое определение) компилятора, а чистая работа компилятора была видна в[50]. И чем одно от другого отличается, мне не понятно и сейчас. Просто понятно, что так можно, а так -нет.
AlexDan (2009-03-14 08:05:00) [14]> Германн © (14.03.09 02:46) [54]
если это обо мне, то самое интересное, что понял я это очень давно). Так же я понял, что этого не понимают:Тын-Дын,и местами Григорьев Антон и Anatoly Podgoretsky. Т.е. 10% из присутствующих на ветке, можно видимо провести аналогию со всеми присутствующими на этом форуме. Так же я не понял, почему >if frac(a/3)=0 then.. можно.
(сравнивать). Я не нашёл ни одного ошибочного результата, включая деление на комбинации чётных и нечётных чисел, и даже на простые числа, что говорит о том, что делфи использует какую-то подмазку, ориентируясь на ожидаемый ответ (для подавляющего большинства) :).
Германн (2009-03-14 02:46:00) [15]
> Тын-Дын © (14.03.09 01:32) [47]
>
>
> > Германн © (14.03.09 01:30) [46]
>
>
> Ну не знаю, искусственный пример или нет. Ты ж код хотел.
>
> Да и ладно. О чём тут спорить. ПУсть автор книги и интернет
> читает.
>
Только что понял!
Велик и могуч русский язык!
:)
:)
Но и очень (язык) труден для понимания "не русских"!
:)
Германн (2009-03-14 01:55:00) [16]
> AlexDan © (14.03.09 01:51) [52]
>
> > Германн © (14.03.09 01:50) [51]
> что ты прав).
>
Чур, чур тебя!
AlexDan (2009-03-14 01:51:00) [17]> Германн © (14.03.09 01:50) [51]
что ты прав).
Германн (2009-03-14 01:50:00) [18]
> AlexDan © (14.03.09 01:47) [49]
Ты этим постом, что хотел сказпть?
AlexDan (2009-03-14 01:49:00) [19]Так может лучше будет..)
да, пример искусственный, логичнее было б так написать:
var
a,b: Double;
begin
a := 1.1;
b := 2;
if a/0.55=b then ShowMessage('=');
Германн (2009-03-14 01:47:00) [20]
> ПУсть автор книги и интернет читает.
>
"ПУсть".
Я только не пойму о какой "книге" ты говоришь!
О, сколько Вас, я читал!