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

Вниз

как определить, делится ли одно 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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.015 c
15-1250364331
Kerk
2009-08-15 23:25
2010.01.03
Попиарюсь маленько :)


2-1258012123
SkyN
2009-11-12 10:48
2010.01.03
как определить, делится ли одно Double на другое Double нацело.


1-1232357960
KiLLiR
2009-01-19 12:39
2010.01.03
Как связать TDateTimePicker с системным временем?


15-1256743947
Игорь
2009-10-28 18:32
2010.01.03
Бросить курить


2-1258117693
stas
2009-11-13 16:08
2010.01.03
Чем заменить конструкцию использующую Application