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

Вниз

Почему некорректно работает frac?   Найти похожие ветки 

 
cvg   (2008-08-13 11:10) [0]

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


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

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


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

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

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


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

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


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

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


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

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


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

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


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

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


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


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

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


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

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


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

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


 
Amoeba ©   (2008-08-13 12:07) [11]


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

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


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


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

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

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");


 
Anatoly Podgoretsky ©   (2008-08-13 13:08) [13]

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

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


 
palva ©   (2008-08-13 14:13) [14]


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

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


 
palva ©   (2008-08-13 14:17) [15]

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



Страницы: 1 вся ветка

Текущий архив: 2008.09.28;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.014 c
15-1217991071
Slider007
2008-08-06 06:51
2008.09.28
С днем рождения ! 6 августа 2008 среда


2-1217765489
demon
2008-08-03 16:11
2008.09.28
Второе окно на API


15-1218030673
demon
2008-08-06 17:51
2008.09.28
Посоветуйте литературу по API


1-1199278775
tiasur
2008-01-02 15:59
2008.09.28
Как использовать PAgeSetup


2-1219018734
Lamer666
2008-08-18 04:18
2008.09.28
Bз одного ADODataSet в Другой?