Форум: "Начинающим";
Текущий архив: 2010.01.03;
Скачать: [xml.tar.bz2];
Внизкак определить, делится ли одно Double на другое Double нацело. Найти похожие ветки
← →
SkyN (2009-11-12 10:48) [0]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 значение.
Понимаю почему так происходит, не могу понять как поправить.
← →
brother © (2009-11-12 10:49) [1]round, trunc ?
← →
SkyN (2009-11-12 11:02) [2]и как мне может помочь round, trunc ?
мне нужна такая функция
function ДелитьсяНацело(a,b: Double): Boolean;
a b result
1 0.1 true
1 0.09 false
1 0.11 false
← →
SkyN (2009-11-12 11:05) [3]Пока я придумал только следующее
function ДелитьсяНацело(a,b: Double): Boolean;
var
c: integer;
begin
c := Round(a*100) mod Round(b*100)
result := (c = 0);
end;
но т.к. работать она будет далеко не для всех входных параметров, применять её меня коробит.
← →
Рамиль © (2009-11-12 11:08) [4]if abs(1-a/b) < eps then делится
eps выбирается в зависимости от задачи
← →
brother © (2009-11-12 11:09) [5]> нацело
это как?
← →
Рамиль © (2009-11-12 11:09) [6]не, перепутал
← →
Рамиль © (2009-11-12 11:11) [7]if abs(a/b - round(a/b)) < eps
← →
SkyN (2009-11-12 11:17) [8]Рамиль, спасибо, что то я ступил
← →
Anatoly Podgoretsky © (2009-11-12 11:30) [9]> SkyN (12.11.2009 11:02:02) [2]
Тогда тебе надо переходить на числа с фиксированой запятой, поскольку 1/0.1 начело никогда не поделится, 0.1 периодическая дробь
← →
Separator © (2009-11-12 13:40) [10]
function DeleniNaCelo(const aValue1, aValue2: Extended): Boolean;
var
mResult: Extended;
begin
mResult := aValue1 / aValue2;
Result := Trunc(mResult) = mResult;
end;
Надеюсь моя телепатия сработала правильно?
← →
Григорьев Антон © (2009-11-12 14:24) [11]
> 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 14:37) [12]Тогда для начала нужно определиться, что такое деление на цело, насколько я помню, это означает, что в результате должно получиться целое число, в этом случае погрешность не нужна
← →
Григорьев Антон © (2009-11-12 14:46) [13]
> в этом случае погрешность не нужна
Это только при условии, что мы можем задать исходные числа без погрешности. А мы в общем случае не можем.
← →
Anatoly Podgoretsky © (2009-11-12 15:51) [14]> Григорьев Антон (12.11.2009 14:46:13) [13]
Это означает, что на бумаге и в программе, могут быть разные результате, на бумаге 1/0,1=10, а в компьютере <> 10
Поскольку число 0,1 возможно только на бумаге и в фиксированой запятой.
← →
Amoeba © (2009-11-12 22:35) [15]И почему даже сам Антон не дал эту ссылку?
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=374
← →
Leonid Troyanovsky © (2009-11-12 22:45) [16]
> Amoeba © (12.11.09 22:35) [15]
> И почему даже сам Антон не дал эту ссылку?
Отрекся :)
--
Regards, LVT.
← →
Германн © (2009-11-12 22:54) [17]
> Amoeba © (12.11.09 22:35) [15]
>
> И почему даже сам Антон не дал эту ссылку?
Чтобы не снижать продажи печатного варианта :)
← →
Leonid Troyanovsky © (2009-11-12 23:00) [18]
> Германн © (12.11.09 22:54) [17]
> Чтобы не снижать продажи печатного варианта :)
Тогда б должна быть, IMHO, где-то скрытая реклама.
Вроде: позвольте, я сверюсь с картотекой.
--
Regards, LVT.
← →
Германн © (2009-11-13 01:45) [19]
> Тогда б должна быть, IMHO, где-то скрытая реклама.
> Вроде: позвольте, я сверюсь с картотекой.
>
Наверно этого суслика мы не видим. :)
← →
brother © (2009-11-13 04:40) [20]> Тогда для начала нужно определиться, что такое деление на
> цело, насколько я помню, это означает, что в результате
> должно получиться целое число, в этом случае погрешность
> не нужна
я спросил еще в [5] это
← →
Григорьев Антон © (2009-11-13 10:36) [21]
> Amoeba © (12.11.09 22:35) [15]
> И почему даже сам Антон не дал эту ссылку?
Если честно, то меня сильно напрягает то, что в моих ответах очень большое количество ссылок на мои же статьи, как будто я не на вопросы отвечаю, а саморекламой занимаюсь. Поэтому там, где я могу без этого обойтись, я пытаюсь обойтись без ссылок. Конкретно на статью про вещественные числа я вообще перестал давать ссылки - она широко известна, поэтому там, где в этом есть смысл, и без меня найдётся кто-то, кто даст на неё ссылку. Что вы и подтвердили своим примером :)
← →
Leonid Troyanovsky © (2009-11-13 10:57) [22]
> Рамиль © (12.11.09 11:11) [7]
> if abs(a/b - round(a/b)) < eps
if abs(a - b*round(a/b)) < eps
--
Regards, LVT.
← →
Anatoly Podgoretsky © (2009-11-13 20:41) [23]> Григорьев Антон (13.11.2009 10:36:21) [21]
она широко известна, но всегда найдется тот, кому не известна.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.01.03;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.005 c