![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как определить, делится ли одно Double на другое Double нацело. [D7, XP, 2003]
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 выбирается в зависимости от задачи