Форум: "Начинающим";
Текущий архив: 2008.09.28;
Скачать: [xml.tar.bz2];
ВнизПочему некорректно работает 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.048 c