Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

как определить, делится ли одно Double на другое Double нацело. [D7, XP, 2003]


Страницы:   1 2

SkyN ©   (2009-11-12 10:48:00) 

procedure TForm1.FormCreate(Sender: TObject);
var
 a,b: Double;
begin
 a := 1;
 b := 0.1;
 caption := FloatToStr( Frac (a/b) );
end;

Возвращает 0,999999999999 , а я надеялся увидеть 0, ну или близкое к 0 значение.

Понимаю почему так происходит, не могу понять как поправить.


Anatoly Podgoretsky   (2009-11-13 20:41:00) [1]

> Григорьев Антон  (13.11.2009 10:36:21)  [21]

она широко известна, но всегда найдется тот, кому не известна.


Leonid Troyanovsky   (2009-11-13 10:57:00) [2]


> Рамиль ©   (12.11.09 11:11) [7]

> if abs(a/b - round(a/b)) < eps

if abs(a - b*round(a/b)) < eps

--
Regards, LVT.


Григорьев Антон   (2009-11-13 10:36:00) [3]


> Amoeba ©   (12.11.09 22:35) [15]
> И почему даже сам Антон не дал эту ссылку?

Если честно, то меня сильно напрягает то, что в моих ответах очень большое количество ссылок на мои же статьи, как будто я не на вопросы отвечаю, а саморекламой занимаюсь. Поэтому там, где я могу без этого обойтись, я пытаюсь обойтись без ссылок. Конкретно на статью про вещественные числа я вообще перестал давать ссылки - она широко известна, поэтому там, где в этом есть смысл, и без меня найдётся кто-то, кто даст на неё ссылку. Что вы и подтвердили своим примером :)


brother   (2009-11-13 04:40:00) [4]

> Тогда для начала нужно определиться, что такое деление на
> цело, насколько я помню, это означает, что в результате
> должно получиться целое число, в этом случае погрешность
> не нужна

я спросил еще в [5] это


Германн   (2009-11-13 01:45:00) [5]


> Тогда б должна быть, IMHO, где-то скрытая реклама.
> Вроде: позвольте, я сверюсь с картотекой.
>

Наверно этого суслика мы не видим. :)


Leonid Troyanovsky   (2009-11-12 23:00:00) [6]


> Германн ©   (12.11.09 22:54) [17]

> Чтобы не снижать продажи печатного варианта :)

Тогда б должна быть, IMHO, где-то скрытая реклама.
Вроде: позвольте, я сверюсь с картотекой.

--
Regards, LVT.


Германн   (2009-11-12 22:54:00) [7]


> Amoeba ©   (12.11.09 22:35) [15]
>
> И почему даже сам Антон не дал эту ссылку?

Чтобы не снижать продажи печатного варианта :)


Leonid Troyanovsky   (2009-11-12 22:45:00) [8]


> Amoeba ©   (12.11.09 22:35) [15]

> И почему даже сам Антон не дал эту ссылку?

Отрекся :)

--
Regards, LVT.


Amoeba   (2009-11-12 22:35:00) [9]

И почему даже сам Антон не дал эту ссылку?
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=374


Anatoly Podgoretsky   (2009-11-12 15:51:00) [10]

> Григорьев Антон  (12.11.2009 14:46:13)  [13]

Это означает, что на бумаге и в программе, могут быть разные результате, на бумаге 1/0,1=10, а в компьютере <> 10
Поскольку число 0,1 возможно только на бумаге и в фиксированой запятой.


Григорьев Антон   (2009-11-12 14:46:00) [11]


> в этом случае погрешность не нужна

Это только при условии, что мы можем задать исходные числа без погрешности. А мы в общем случае не можем.


Separator   (2009-11-12 14:37:00) [12]

Тогда для начала нужно определиться, что такое деление на цело, насколько я помню, это означает, что в результате должно получиться целое число, в этом случае погрешность не нужна


Григорьев Антон   (2009-11-12 14:24:00) [13]


> Separator ©   (12.11.09 13:40) [10]

Лучше использовать не Trunc, а Int - результат получается не целым, а вещественным, нет дополнительных расходов на преобразование целого значения при сравнении с вещественным. А ещё лучше использовать Frac для получения дробной части числа и проверять, что либо Frac<Eps, либо 1-Frac<Eps, где Eps - допустимая погрешность. Или, как вариант, что Abs(Int(Result)-Result)<Eps.


Separator   (2009-11-12 13:40:00) [14]

function DeleniNaCelo(const aValue1, aValue2: Extended): Boolean;
var
 mResult: Extended;
begin
 mResult := aValue1 / aValue2;
 Result := Trunc(mResult) = mResult;
end;


Надеюсь моя телепатия сработала правильно?


Anatoly Podgoretsky   (2009-11-12 11:30:00) [15]

> SkyN  (12.11.2009 11:02:02)  [2]

Тогда тебе надо переходить на числа с фиксированой запятой, поскольку 1/0.1  начело никогда не поделится, 0.1 периодическая дробь


SkyN   (2009-11-12 11:17:00) [16]

Рамиль, спасибо, что то я ступил


Рамиль   (2009-11-12 11:11:00) [17]

if abs(a/b - round(a/b)) < eps


Рамиль   (2009-11-12 11:09:00) [18]

не, перепутал


brother   (2009-11-12 11:09:00) [19]

> нацело

это как?


Рамиль   (2009-11-12 11:08:00) [20]

if abs(1-a/b) < eps then делится
eps выбирается в зависимости от задачи


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо