Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.04.26;
Скачать: CL | DM;

Вниз

Реал и матем. функции.   Найти похожие ветки 

 
AlexDan ©   (2009-03-10 19:39) [0]

Вот такое выражение равно 1-це.
chb:real; chb:=1.2;
abs(frac(chb/0.6))
Вроде должен быть 0?, насколько я понимаю..?.


 
AlexDan ©   (2009-03-10 19:42) [1]

Случайно при пошаговой отладке обнаружил(.


 
AlexDan ©   (2009-03-10 20:36) [2]

Глюк мат. функций?, по моему я что-то вроде в ТР встречал как-то.


 
Юрий Зотов ©   (2009-03-10 20:39) [3]

1.2/0.6 не равно 2.0, потому что 0.6 степенью двойки не является.


 
Amoeba ©   (2009-03-10 22:53) [4]

Автору вопроса читать до полного просветления, дабы таких вопросов более не возникало:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=374


 
Palladin ©   (2009-03-11 08:09) [5]

Автору вопроса уже давали эту ссылку. Дважды. Но он сказал не учите меня жить помогите материально.


 
Amoeba ©   (2009-03-11 11:05) [6]


> Palladin ©   (11.03.09 08:09) [5]
>
> Автору вопроса уже давали эту ссылку. Дважды. Но он сказал
> не учите меня жить помогите материально.

Ну что ж, больше не буду метать бисер.


 
AlexDan ©   (2009-03-11 22:34) [7]

Тут дело не в бисере). Теорию я конечно в общих чертах представляю. Вопрос здесь и не только стоял более практический. Т.е. такой подход:
if frac(b/3)=0 then.., где b,-real считаю надёжным, т.е. рабочим.
if frac(b/0.6)=0 then..,- считаю нерабочим, т.к. равенство нулю не выполнится никогда. Вот я и спрашивал, чем можно второй подход заменить. Мне пришлось просто заменить его на другой алгоритм, потому как  к другим функциям или формулам перейти нельзя видимо.


 
Германн ©   (2009-03-12 00:09) [8]


> Теорию я конечно в общих чертах представляю. Вопрос здесь
> и не только стоял более практический. Т.е. такой подход:
>
> if frac(b/3)=0 then.., где b,-real считаю надёжным, т.е.
>  рабочим.

Фигово представляешь. Вещественные числа НИКОГДА нельзя сравнивать на строгое равенство! Ни в математике ни, тем более в программировании.


 
Anatoly Podgoretsky ©   (2009-03-12 00:54) [9]

> Германн  (12.03.2009 0:09:08)  [8]

Можно и там и там.


 
Германн ©   (2009-03-12 01:17) [10]


> Anatoly Podgoretsky ©   (12.03.09 00:54) [9]
>
> > Германн  (12.03.2009 0:09:08)  [8]
>
> Можно и там и там.
>

Нельзя ни там, ни там!
Имею мнение, попробуй оспорить!


 
Тын-Дын ©   (2009-03-12 01:36) [11]


> Anatoly Podgoretsky ©   (12.03.09 00:54) [9]
> > Германн  (12.03.2009 0:09:08)  [8]Можно и там и там.


Абсолютно точно-)


 
Германн ©   (2009-03-12 01:38) [12]


> Тын-Дын ©   (12.03.09 01:36) [11]
>
>
> > Anatoly Podgoretsky ©   (12.03.09 00:54) [9]
> > > Германн  (12.03.2009 0:09:08)  [8]Можно и там и там.
>
>
>
> Абсолютно точно-)
>

Ну попробуй, оспорь.


 
Тын-Дын ©   (2009-03-12 01:41) [13]


> Германн ©   (12.03.09 01:38) [12]
> > Тын-Дын ©   (12.03.09 01:36) [11]> > > > Anatoly Podgoretsky
> ©   (12.03.09 00:54) [9]> > > Германн  (12.03.2009 0:09:
> 08)  [8]Можно и там и там.> > > > Абсолютно точно-)> Ну
> попробуй, оспорь.


Это ты попробуй.
Кто сказал, что нельзя сравнивать?


 
Германн ©   (2009-03-12 01:44) [14]


> Кто сказал, что нельзя сравнивать?

Ты пьян, или ...
Это я сказал.

Хм.
Ты вообще с кем разговариваешь?


 
Тын-Дын ©   (2009-03-12 01:52) [15]


> Германн ©   (12.03.09 01:44) [14]
> > Кто сказал, что нельзя сравнивать?Ты пьян, или ... Это
> я сказал. Хм. Ты вообще с кем разговариваешь?


А ты что, авторитет в некоторых кругах?

Кто мне может запретить сравнивать?


 
Германн ©   (2009-03-12 02:09) [16]


> Тын-Дын ©   (12.03.09 01:52) [15]
>
>
> > Германн ©   (12.03.09 01:44) [14]
> > > Кто сказал, что нельзя сравнивать?Ты пьян, или ... Это
> > я сказал. Хм. Ты вообще с кем разговариваешь?
>
>
> А ты что, авторитет в некоторых кругах?
>
> Кто мне может запретить сравнивать?
>

Никто не может тебе запретить ничто! Но пить, надо меньше! Это уже совет именно к тебе!


 
AlexDan ©   (2009-03-12 02:15) [17]

Германн прав, я только что как раз это всё прогнал:
  if frac(a/b)=0 then.. можно, где a,b:real,
  if frac(a/0.6)=0 then.. нельзя. Причём if frac(a/3)=0 then.. можно.


 
Германн ©   (2009-03-12 02:24) [18]


> AlexDan ©   (12.03.09 02:15) [17]
>
> Германн прав, я только что как раз это всё прогнал:

Ну спасибо.
Но прав не Германн. Права наука!


 
AlexDan ©   (2009-03-12 02:34) [19]

Хотя, если честно, понять сложно, почему
if frac(a/0.6)=0 then.. нельзя
if frac(a/3)=0 then.. можно. Наверно представление чисел, я на этот счёт толком ничего не читал..)


 
Германн ©   (2009-03-12 02:56) [20]


> AlexDan ©   (12.03.09 02:34) [19]
>
> Хотя, если честно, понять сложно, почему
> if frac(a/0.6)=0 then.. нельзя
> if frac(a/3)=0 then.. можно. Наверно представление чисел,
>  я на этот счёт толком ничего не читал..)
>

Ну может наконец-то почитаешь что-нибудь!
Или ты совсем "пустой нуль"?


 
Германн ©   (2009-03-12 02:58) [21]


> if frac(a/3)=0 then.. можно.

Ну не можно!
Тебе где-то повезло.


 
Anatoly Podgoretsky ©   (2009-03-12 07:44) [22]

> Германн  (12.03.2009 1:38:12)  [12]

Зачем бить головой об стену.


 
korneley ©   (2009-03-12 08:20) [23]

Ну вы на ровном месте битву развернули! :))) Автор же пишет "Наверно представление чисел, я на этот счёт толком ничего не читал" И это после, как минимум, трёх (!) выданных ему ссылок на статью.
А сравнивать на равенство, конечно, никто не запрещает. Вот только результат может удивить :)


 
Anatoly Podgoretsky ©   (2009-03-12 08:46) [24]

> korneley  (12.03.2009 8:20:23)  [23]

А может быть единственно верным.
Ветка познавательная - о вреде догматов.


 
Григорьев Антон ©   (2009-03-12 09:54) [25]

В ряде частных случаев вещественные числа сравнивать операцией "=" вполне можно. Например, банальная проверка является ли число квадратом целого: if Fraq(Sqrt(X)) = 0 ... вполне работоспособна.


 
korneley ©   (2009-03-12 11:08) [26]


> Григорьев Антон ©   (12.03.09 09:54) [25]
> В ряде частных случаев...

Так и я о том. Знать надо, что и для чего лепишь. "Чтобы не было мучительно больно за..." (с) :) У автора другая проблема: читать/учиться не желает, но выдвигает "смелые" гипотезы, как в [2]. Уж не знаю, что с ним будет, когда он случайно обнаружит, что round(1.5) = round(2.5)


 
Palladin ©   (2009-03-12 11:14) [27]


> korneley ©   (12.03.09 11:08) [26]

ну зачем ты это сказал... ведь всю жизь человеку испортил :)


 
Ega23 ©   (2009-03-12 11:18) [28]


> Уж не знаю, что с ним будет, когда он случайно обнаружит,
>  что round(1.5) = round(2.5)


Гм... Я в этих делах не шибко силён, но, ЕМНИП - не всегда. Там же можно как-то алгоритм округления выбирать? Или я "с прямым углом спутал" (с)?


 
korneley ©   (2009-03-12 11:27) [29]


> Ega23 ©   (12.03.09 11:18) [28]
> Там же можно как-то алгоритм округления выбирать?

"This method of rounding is often called "Banker’s Rounding". А стало быть, при равноудалённости, до ближайшего чётного ;) Правда, SetRoundMode(), тоже никто не отменял :)))


 
Игорь Шевченко ©   (2009-03-12 11:30) [30]

Германн ©   (12.03.09 01:44) [14]


> Ты пьян, или ...
> Это я сказал.
>
> Хм.
> Ты вообще с кем разговариваешь?


Есть предложение не писать таких постов. Во-первых, оффтопик, во-вторых троллизм, в-третьих, элементарная невежливость.


 
Palladin ©   (2009-03-12 11:31) [31]


> Ega23 ©   (12.03.09 11:18) [28]

Если ты имеешь в виду это:
SetRoundMode(rmNearest);
Memo1.Lines.Add("rmNearest:"+BoolToStr(round(1.5) = round(2.5),True));
SetRoundMode(rmDown);
Memo1.Lines.Add("rmDown:"+BoolToStr(round(1.5) = round(2.5),True));
SetRoundMode(rmUp);
Memo1.Lines.Add("rmUp:"+BoolToStr(round(1.5) = round(2.5),True));
SetRoundMode(rmTruncate);
Memo1.Lines.Add("rmTruncate:"+BoolToStr(round(1.5) = round(2.5),True));

то боюсь тебя разочаровать :)


 
Ega23 ©   (2009-03-12 11:31) [32]


> Правда, SetRoundMode(), тоже никто не отменял :)))


Во, я помню что что-то такое было!


 
Ega23 ©   (2009-03-12 11:34) [33]


> то боюсь тебя разочаровать :)


Не знаю, я (тьфу-тьфу-тьфу) из всех округлений только

CREATE PROCEDURE S_GetDayTime
@DateTime datetime=0,
@Date    datetime=0 output,
@Time datetime=0 output,
@DateTimeStr varchar(32)="" output,
@Debug int=-1
AS
set nocount on
  Set @Date=cast( Floor(cast(@DateTime as numeric(18,12))) as datetime)
  Set @Time=@DateTime-@Date
  set @DateTimeStr=convert(char(10),@DateTime,104)+" "+convert(char(5),@DateTime,108)
GO

использовал...  :)


 
Palladin ©   (2009-03-12 11:36) [34]

Удалено модератором
Примечание: дубль


 
Германн ©   (2009-03-13 01:08) [35]


> Игорь Шевченко ©   (12.03.09 11:30) [30]

Принято.
Больше такого не будет.
Прошу извинения у всех, кого я "нечаянно обидел". Честное слово, нечаянно!
Был вчера "несколько не в себе" под влиянием медицинских препаратов. Простудился, блин. А жена моя, врач мой, начала меня лечить! :(


> Тын-Дын ©   (12.03.09 01:41) [13]
>
>
> > Германн ©   (12.03.09 01:38) [12]
> > > Тын-Дын ©   (12.03.09 01:36) [11]> > > > Anatoly Podgoretsky
> > ©   (12.03.09 00:54) [9]> > > Германн  (12.03.2009 0:09:
>
> > 08)  [8]Можно и там и там.> > > > Абсолютно точно-)> Ну
> > попробуй, оспорь.
>
>
> Это ты попробуй.

Попробую.
Искусственные ситуации, в которых мы можем сравнивать результат математических функций, в которых параметрами являются вещественные числа, или результат этих функций является вещественным числом (это уже относится не к математике, а к программированию) легко создать.

> Григорьев Антон ©   (12.03.09 09:54) [25]


Но это искусственные примеры, которые были созданы "наоборот".  В таком примере, нет никакого смысла проверять его результат!.
А в реальной задаче (программе) проверять "строгое" равенство - по крайней мере неумно.
Это в "общем случае". Каким и является сабж.

P.S. Надеюсь автор сабжа наконец начнёт читать и думать.


 
AlexDan ©   (2009-03-13 21:03) [36]

> Германн ©   (13.03.09 01:08) [35]
> P.S. Надеюсь автор сабжа наконец начнёт читать и думать.
Будем надеяться..:)). AlexDan/


 
Amoeba ©   (2009-03-13 22:33) [37]

Верится с трудом


 
AlexDan ©   (2009-03-14 00:10) [38]

> Amoeba ©   (13.03.09 22:33) [37]
А у меня гуппи редкие вывелись случайно, зелёные кобры. Это я Вам как гидробиологу говорю). Красивые заразы, говорят дорого стоят, не знаю куда их девать..(. Множаться потихоньку..


 
Тын-Дын ©   (2009-03-14 00:27) [39]


> Германн ©   (13.03.09 01:08) [35]
>Попробую.Искусственные ситуации, в которых
> мы можем сравнивать результат математических функций, в
> которых параметрами являются вещественные числа, или результат
> этих функций является вещественным числом (это уже относится
> не к математике, а к программированию) легко создать.


В основном результыты математических вычислений совершенно спокойно можно сравнивать между собой, так как, в отличие от методов вычислений, используемых в вычислительной технике, в математике результат вычислений (при получении точных промежуточных результатов - где это возможно), является во множестве случаев конечным числом.

Всё зависит от цели сравнения.
Поэтому говорить, что нельзя сравнивать вещественные числа на равенство - неверно. И неверно даже в общем случае.


 
Германн ©   (2009-03-14 00:50) [40]


> Тын-Дын ©   (14.03.09 00:27) [39]
>
>
> > Германн ©   (13.03.09 01:08) [35]
> >Попробую.Искусственные ситуации, в которых
> > мы можем сравнивать результат математических функций,
> в
> > которых параметрами являются вещественные числа, или результат
> > этих функций является вещественным числом (это уже относится
> > не к математике, а к программированию) легко создать.
>
>
> В основном результыты математических вычислений совершенно
> спокойно можно сравнивать между собой, так как, в отличие
> от методов вычислений, используемых в вычислительной технике,
>  в математике результат вычислений (при получении точных
> промежуточных результатов - где это возможно), является
> во множестве случаев конечным числом.
>
> Всё зависит от цели сравнения.
> Поэтому говорить, что нельзя сравнивать вещественные числа
> на равенство - неверно. И неверно даже в общем случае.
>

Во-первых, я говорил именно о "строгом" равенстве. Причём при сравнении некоего результата с некоей константой. (Как и было в сабже).
Во-вторых, я всё таки имел в виду скорее физику, чем математику. (У меня диплом именно физика).
В-третьих, Моё "БЕЗАПЕЛЛЯЦИОННОЕ" (постарался указать почти все "выделения", которые я в нём использовал :) высказывание в [8] было вызвано теми причинами, за которые я уже принёс свои извинения в [35].
И, наконец. В-четвёртых. Уже много на сём форуме видел вопросов, в которых авторы удивлялись "почему не срабатывает" подобное сравнение. Поэтому и попробовал наставить автора на путь истинный таким "громогласным" образом. (Типа "шоковой терапии" :).
Надеюсь, что "пронял" автора :)

P.S. В-пятых меня смутил АП.
Чтоб ему пусто было :)


 
AlexDan ©   (2009-03-14 01:02) [41]

> Германн ©   (14.03.09 00:50) [40]
> Поэтому и попробовал наставить автора на путь истинный таким
> "громогласным" образом. (Типа "шоковой терапии" :).
Ну всё)), автор в шоке:)). Только сейчас об этом узнал..).


 
Германн ©   (2009-03-14 01:06) [42]


> Тын-Дын ©   (14.03.09 00:27) [39]

Да. Кстати.
В порядке ответной "дружественной" акции.
Не представишь ли мне "реальный" пример программы, где можно использовать сравнение вещественного числа  на "строгое" равенство с константой?
Про "физику" я не спрашиваю. Ибо не знаю тебя лично. И не имею никаких сведений о тебе, кроме анкеты.


 
Тын-Дын ©   (2009-03-14 01:06) [43]


> Германн ©   (14.03.09 00:50) [40]


> P.S. В-пятых меня смутил АП. Чтоб ему пусто было :)


Ну... Анатолия можно понимать по-разному.
В данном случае я поддержал его потому, что как раз высказывание его было "буквально". Т.е. хто ж может запретить сравнить-то?-)


 
Германн ©   (2009-03-14 01:07) [44]


> AlexDan ©   (14.03.09 01:02) [41]

А ты сейчас не смейся.
Потом будешь плакать :)


 
Тын-Дын ©   (2009-03-14 01:19) [45]


> Германн ©   (14.03.09 01:06) [42]
> > Тын-Дын ©   (14.03.09 00:27) [39]Да. Кстати.В порядке
> ответной "дружественной" акции.Не представишь ли мне "реальный"
> пример программы, где можно использовать сравнение вещественного
> числа  на "строгое" равенство с константой? Про "физику"
> я не спрашиваю. Ибо не знаю тебя лично. И не имею никаких
> сведений о тебе, кроме анкеты.


Так я ж написал, что математические вычисления "на бумаге" отличаются от компьютерных методов.

Хотя даже такой вариант пройдёт:

var
 a,b: Double;
begin
 a := 1.1;
 b := 0.55;
 if a/2=b then ShowMessage("=");

 a := 2/3;
 b := a*3;
 if b=2 then ShowMessage("=");


 
Германн ©   (2009-03-14 01:30) [46]


> Тын-Дын ©   (14.03.09 01:19) [45]
>
>
> > Германн ©   (14.03.09 01:06) [42]
> > > Тын-Дын ©   (14.03.09 00:27) [39]Да. Кстати.В порядке
> > ответной "дружественной" акции.Не представишь ли мне "реальный"
> > пример программы, где можно использовать сравнение вещественного
> > числа  на "строгое" равенство с константой? Про "физику"
> > я не спрашиваю. Ибо не знаю тебя лично. И не имею никаких
> > сведений о тебе, кроме анкеты.
>
>
> Так я ж написал, что математические вычисления "на бумаге"
> отличаются от компьютерных методов.
>
> Хотя даже такой вариант пройдёт:
>
> var
>  a,b: Double;
> begin
>  a := 1.1;
>  b := 0.55;
>  if a/2=b then ShowMessage("=");
>
>  a := 2/3;
>  b := a*3;
>  if b=2 then ShowMessage("=");
>

Ну опять я про Фому, а ты про Ерёму.

Я ведь пост [8] адресовал не к тебе, а к автору сабжа.
И про "искусственные" варианты тоже написал. :(
А ты в ответ подсовываешь другие "искусственные" варианты.
Спор ради спора?
Я -пас!


 
Тын-Дын ©   (2009-03-14 01:32) [47]


> Германн ©   (14.03.09 01:30) [46]


Ну не знаю, искусственный пример или нет. Ты ж код хотел.
Да и ладно. О чём тут спорить. ПУсть автор книги и интернет читает.


 
Германн ©   (2009-03-14 01:47) [48]


> ПУсть автор книги и интернет читает.
>

"ПУсть".
Я только не пойму о какой "книге" ты говоришь!
О, сколько Вас, я  читал!


 
AlexDan ©   (2009-03-14 01:47) [49]


> Тын-Дын ©   (14.03.09 01:32) [47]
>
> > Германн ©   (14.03.09 01:30) [46]
>
>
> Ну не знаю, искусственный пример или нет. Ты ж код хотел.
да, пример искусственный, логичнее было б так написать:
var
a,b: Double;
begin
a := 1.1;
b := 2;
if a/0.55=b then ShowMessage("=");


 
AlexDan ©   (2009-03-14 01:49) [50]

Так может лучше будет..)
да, пример искусственный, логичнее было б так написать:
var
a,b: Double;
begin
a := 1.1;
b := 2;
if a/0.55=b then ShowMessage("=");


 
Германн ©   (2009-03-14 01:50) [51]


> AlexDan ©   (14.03.09 01:47) [49]

Ты этим постом, что хотел сказпть?


 
AlexDan ©   (2009-03-14 01:51) [52]

> Германн ©   (14.03.09 01:50) [51]
что ты прав).


 
Германн ©   (2009-03-14 01:55) [53]


> AlexDan ©   (14.03.09 01:51) [52]
>
> > Германн ©   (14.03.09 01:50) [51]
> что ты прав).
>

Чур, чур тебя!


 
Германн ©   (2009-03-14 02:46) [54]


> Тын-Дын ©   (14.03.09 01:32) [47]
>
>
> > Германн ©   (14.03.09 01:30) [46]
>
>
> Ну не знаю, искусственный пример или нет. Ты ж код хотел.
>
> Да и ладно. О чём тут спорить. ПУсть автор книги и интернет
> читает.
>

Только что понял!
Велик и могуч русский язык!
:)
:)
Но и очень (язык) труден для понимания "не русских"!
:)


 
AlexDan ©   (2009-03-14 08:05) [55]

> Германн ©   (14.03.09 02:46) [54]
если это обо мне, то самое интересное, что понял я это очень давно). Так же я понял, что этого не понимают:Тын-Дын,и местами Григорьев Антон и Anatoly Podgoretsky. Т.е. 10% из присутствующих на ветке, можно видимо провести аналогию со всеми присутствующими на этом форуме. Так же я не понял, почему  >if frac(a/3)=0 then.. можно.
(сравнивать). Я не нашёл ни одного ошибочного результата, включая деление на комбинации чётных и нечётных чисел, и даже на простые числа, что говорит о том, что делфи использует какую-то подмазку, ориентируясь на ожидаемый ответ (для подавляющего большинства) :).


 
AlexDan ©   (2009-03-14 08:23) [56]

Прошу Григорьев Антон и Anatoly Podgoretsky не обижаться).а подмазка была видна в Тын-Дын ©   (14.03.09 01:19) [45], хотя это даже не подмазка, а "подход работы" (корявое определение) компилятора, а чистая работа компилятора была видна в[50]. И чем одно от другого отличается, мне не понятно и сейчас. Просто понятно, что так можно, а так -нет.


 
korneley ©   (2009-03-14 09:22) [57]


> Тын-Дын ©   (14.03.09 01:19) [45]

А давай немного изменим код:

 a := 2.1/3;
 b := a*3;
 if b = 2.1 then ShowMessage("=") else ShowMessage("<>");

Пока что, единственный вариант разумного сравнения на равенство, приведённый в данной ветке, это [25]. И опять же это делается "с чувством, толком, расстановкой" (с) :) Т.е. человек знает, что, зачем и почему.


 
korneley ©   (2009-03-14 09:32) [58]


> AlexDan ©   (14.03.09 08:23) [56]

Ну вот ещё здесь почитать можно (нужно)
http://ltwood.wikidot.com/float#toc14


 
AndreyV ©   (2009-03-14 10:45) [59]

> [55] AlexDan ©   (14.03.09 08:05)
> > Германн ©   (14.03.09 02:46) [54]
> что говорит о том, что делфи использует
> какую-то подмазку, ориентируясь на ожидаемый ответ (для
> подавляющего большинства) :).

Ты предложенные статьи прочитал? Делфи пофиг, что ты там подставляешь. А запретить точное сравнение тебе никто не может, тем более Делфи и те 10%, которые "не понимают".


 
Германн ©   (2009-03-15 03:06) [60]


> AlexDan ©   (14.03.09 08:05) [55]
>
> > Германн ©   (14.03.09 02:46) [54]
> если это обо мне, то самое интересное, что понял я это очень
> давно). Так же я понял, что этого не понимают:Тын-Дын,и
> местами Григорьев Антон и Anatoly Podgoretsky. Т.е. 10%
> из присутствующих на ветк

Ты опять ничего не понял, очевидно, :(
И Тын-Дын и АП и, тем более  Григорьев Антон это понимают!
Просто первые два "не хотят" меня понимать! Но хотят со мной спорить!
Ну жисть у них такая скушная, что без кулачного боя/или/ спора на ДМ  им жизнь не интересна!
А третий слишком умный, чтобы "влезать"" Ну так он МИФИ"ст! :)


 
AlexDan ©   (2009-03-15 08:18) [61]

> Германн ©   (15.03.09 03:06) [60]
ок)


 
Anatoly Podgoretsky ©   (2009-03-15 08:35) [62]

> Германн  (14.03.2009 0:50:40)  [40]

Я всю правду рассказал, а не смущал.
Можно сравнивать и нужно сравнивать, если нужно строгое сравнение.


 
palva ©   (2009-03-15 11:33) [63]

Конечно, нужно сравнивать. Особенно это нужно автору. Если бы он перед тем, как задавать вопрос, сравнил...

var chb:real;
begin
   // > Вот такое выражение равно 1-це.
   chb:=1.2;
   WriteLn(abs(frac(chb/0.6)) = 1.0); // FALSE
end.

то убедился бы, что выражение не равно единице. И вопрос бы сразу отпал.


 
Григорьев Антон ©   (2009-03-15 12:21) [64]


> Германн ©   (14.03.09 01:06) [42]
> Не представишь ли мне "реальный" пример программы, где можно
> использовать сравнение вещественного числа  на "строгое"
> равенство с константой?

Долго объяснять суть, но в одной моей программе есть, например, код с таким смыслом:

var
 X:Extended;
...
X := 0;

// Здесь идёт код, который, в зависимости от разных условий,
// либо записывает в X значение, гарантированно отличное от нуля,
// либо оставляет эту переменную без изменения

if X=0 then... // Вот оно, точное сравнение


Добавлю только, что это всё происходит не в одной процедуре, а в разных методах. Инициализация X нулём - в конструкторе (естестванно, неявная), код, который, возможно, изменит значение - в одном методе, код, который проверяет на равенство нулю - в другом.

Можно было бы, конечно, добавить булевский флаг, показывающий, вычислялось X или нет, но я не вижу смысла - тут и так всё корректно работает.

А вообще, когда я писал программы с большим количеством вещественных вычислений, то, помнится, не так уж мало было ситуаций, когда точное сравнение было вполне допустимо. Сейчас сходу не вспомню, в каких ситуациях, но было.


 
palva ©   (2009-03-15 12:51) [65]

У меня был подобный случай. Правда процессор был другой - IBM370. Там при плавающих операциях могла случиться потеря точности (underflow) Это когда при вычитании очень близких чисел получался почти ноль. Поскольку разница у чисел была где-то в битах округления, то ненулевой результат не имел ни одного верного знака. Процессор считал это криминалом и ронял задачу. Мне пришлось вставить код, где я перед вычитанием проверял операнды и при их очень сильной близости присваивал результату машинный ноль. Вот такой результат я затем проверял на равенство нулю, чтобы принять решение, нужно ли продолжать итерации.


 
Anatoly Podgoretsky ©   (2009-03-15 13:10) [66]


> Григорьев Антон ©   (15.03.09 12:21) [64]

Ну и кто всех с толку сбил, кто написал статью так, что они теперь как огня боятся точного сравнения.


 
Григорьев Антон ©   (2009-03-15 13:37) [67]


> Anatoly Podgoretsky ©   (15.03.09 13:10) [66]
> Ну и кто всех с толку сбил, кто написал статью так, что
> они теперь как огня боятся точного сравнения.

Дык, не писал я, что нельзя сравнивать вообще. Я писал о том, какие проблемы могут возникнуть, и полагал, что человек, разобравшийся с этим, сам поймёт, когда можно, а когда нельзя. Но многие предпочли сделать более простой вывод: "Низзя, и всё тут!"

Господь диктует Моисею Тору:- ... не вари козленка в молоке матери его...
Моисей:- O, погоди, минуточку... А-а-а-а, я понял! Это означает - не ешь мясного с молочным?!
Господь:- Hе фантазируй. Пиши, что говорят - не вари козленка в моло...
Моисей:- Aааа, сейчас, ага, все - понял: надо иметь отдельную посуду для мяса и молока!
Господь (раздраженно):- Послушай, что ты несешь? Я же тебе ясно сказал! Не выдумывай, пиши, что диктуют: не вари козлен...
Моисей:- Bсе, все, вот теперь - понял: после мясного надо подождать шесть часов, прежде чем есть молочное, а после молочного...
Господь (устало, махнув рукой):- Э, делайте, что хотите...


 
korneley ©   (2009-03-15 14:09) [68]


> Anatoly Podgoretsky ©   (15.03.09 13:10) [66]
> > Григорьев Антон ©   (15.03.09 12:21) [64] Ну и кто всех
> с толку сбил, кто написал статью так, что они теперь как
> огня боятся точного сравнения.

Да нормальная статья. Или, давайте, тогда уже и Дейкстре предъявы выставлять :)

> Григорьев Антон ©   (15.03.09 13:37) [67]

Напомнило фильм, "Всемирная история", Мэла Брукса. Выходит Моисей с тремя глиняными табличками: "Люди, я принес вам 15 заповедей!" Роняет одну, та - вдребезги. "Люди! Я принёс вам 10 заповедей!" :))



Страницы: 1 2 вся ветка

Текущий архив: 2009.04.26;
Скачать: CL | DM;

Наверх




Память: 0.68 MB
Время: 0.011 c
4-1208862881
kalexi
2008-04-22 15:14
2009.04.26
Проблема с SetLayeredWindowAttributes


2-1237205386
девушка
2009-03-16 15:09
2009.04.26
Аналог explod из PHP


15-1235469134
Boom boom box
2009-02-24 12:52
2009.04.26
Вывод на второй дисплей


2-1236876949
Timur
2009-03-12 19:55
2009.04.26
Сравнение массивов


2-1237106993
ML
2009-03-15 11:49
2009.04.26
Процедуры