Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1218030673
demon
2008-08-06 17:51
2008.09.28
Посоветуйте литературу по API


4-1197207030
EgorovAlex
2007-12-09 16:30
2008.09.28
Пул потоков и приоритет - начал тестирование QueueUserWorkItem


2-1219139355
_koha
2008-08-19 13:49
2008.09.28
Почему это не работает


2-1219127174
Demo_nik
2008-08-19 10:26
2008.09.28
сумма поля


2-1218968367
altatr
2008-08-17 14:19
2008.09.28
Как узнать об активных сетевых подключениях





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский