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

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

Почему некорректно работает frac? [D7, XP]


cvg ©   (2008-08-13 11:10:00) 

Чё-то ничё не могу понять! :( В функцию передается параметр vart, в данном случае равный 16,3. По else if trunc(vart) = 16 я вышел на ветку разбора 16-го варианта. Пишу else if frac(vart) = 0.3, отладчик показывает, что это выражение равно False, хотя тут же он же показывает, что frac(vart) равно 0,3. Ну и как же это понимать?


palva   (2008-08-13 14:17:00) [1]

Для таких целей в модуле Math есть функция
SameValue(A, B, eps)


palva   (2008-08-13 14:13:00) [2]


> Но вот это все равно надо читать до полного просветления:

Да вообще-то можно и не читать. Достаточно усвоить правило, которое пишут во всех учебниках: всегда считать, что плавающие числа представлены в ЭВМ с некоторой погрешностью. Бывают исключения, но о них ИМХО лучше и не знать вовсе, и в рабочих проектах на них не полагаться. Если вам требуются числа без погрешности, то используйте целые типы.


Anatoly Podgoretsky   (2008-08-13 13:08:00) [3]

> Vlad Oshin  (13.08.2008 12:35:12)  [12]

Вообще то так Result := abs(a-b)<eps;


Vlad Oshin   (2008-08-13 12:35:00) [4]


> Ладно, понял, пойду другим путем...

обычно делают так:

function IsNumEq(a,b:double; eps:double=0.000000001);
begin
if abs(a-b)<eps
 then result:=true
 else result:=false;
end;
.......
if IsNumEq(frac(vart) ,0.3) tehn showmessage('Равно с точностью по умолчанию');
if IsNumEq(frac(vart) , 0.3, 0.0001) tehn showmessage('Равно с точностью 0.0001');


Amoeba   (2008-08-13 12:07:00) [5]


> cvg   (13.08.08 12:03) [10]
>
> Ладно, понял, пойду другим путем

Но вот это все равно надо читать до полного просветления:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=374


cvg   (2008-08-13 12:03:00) [6]

Ладно, понял, пойду другим путем...


Medbe}I{onok XML   (2008-08-13 11:57:00) [7]

да и такой литерал в тексте программы как 0.3 на самом деле не равен 0.3 как дабл значение


Anatoly Podgoretsky   (2008-08-13 11:49:00) [8]


> и как же это понимать?

Это надо понимать, что ты не понимаешь, что такое числа в программе.
Для чисел с плавающей запятой, числа 0,3 нет!!!


Medbe}I{onok XML   (2008-08-13 11:23:00) [9]

раунд что возвращает?
дабл. а даблы сравнивать на равно минздрав не рекомендует.
ибо результат известен заранее.


Medbe}I{onok XML   (2008-08-13 11:22:00) [10]

правильный результат


Amoeba   (2008-08-13 11:22:00) [11]

Точнее "Неочевидные особенности вещественных чисел":
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=374


cvg   (2008-08-13 11:21:00) [12]

Ну, я ж попробовал и так написать: if roundto(frac(vart),-1) = 0.3, но результат-то тот же :(


Vlad Oshin   (2008-08-13 11:19:00) [13]

яндекс + неявные особенности вещественных чисел


Medbe}I{onok XML   (2008-08-13 11:18:00) [14]

хотя тут же он же показывает, что frac(vart) равно 0,3

Он показывает строковое представление значения с определенной точностью.
А само значение не равно 0.3


Medbe}I{onok XML   (2008-08-13 11:17:00) [15]

правильно показывает отладчик


Наверх

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