Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1257313780
Kolan
2009-11-04 08:49
2010.01.03
Делать DMClient опенсорсным?


11-1189413525
Alexey_k
2007-09-10 12:38
2010.01.03
проблемы с TKOLActionList


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


15-1256980367
DmitriyG.
2009-10-31 12:12
2010.01.03
Виснет Delphi


2-1257965995
Игорь
2009-11-11 21:59
2010.01.03
System Idle Process





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский