2017-01-21 2 views
6

Я знаю, что сохранение единственного значения (или двойного) не может быть очень точным. поэтому сохранение, например, 125.12, может привести к 125.1200074788. теперь в delphi их некоторая полезная функция, например samevalue или comparevalue, которые принимают epsilon как param и говорят, что 125.1200074788 или, например, 125.1200087952 равно.single, double и precision

но я часто вижу в кодах такие вещи, как: если aSingleVar = 0, то ... и это на самом деле, как я вижу, всегда работает. Зачем ? почему сохранение в качестве примера 0 в одном var сохраняет точное значение?

+0

Zero является представимым. Сравнение с допуском достаточно просто, но как вы выбираете толерантность? Вам нужно понять алгоритм. Любой совет, даваемый без знания алгоритма, скорее всего, является плохим советом. –

ответ

9

Только значения, которые находятся в форме m*2^e, где m и e являются целыми числами, могут храниться в переменной с плавающей запятой (не все из них, хотя это зависит от точности). 0 имеет такую ​​форму, и 125.12 этого не делает, поскольку он равен 3128/25, а 1/25 не является цельной мощностью 2.

Сравнение 125.12 к одному (или двойной) прецизионной переменной, скорее всего, вернется всегда False, потому что буквальный 125.12 будет рассматриваться в качестве расширенного числа точности, и ни один (или двойной) точностью и не будет иметь такое значение.

+0

Итак, это означает, что реализация delphi функции TRectf.IsEmpty: Boolean; начало Результат: = (справа <= слева) или (снизу <= сверху); конец; если не очень точно? – loki

+1

@ loki проблема заключается в равенстве разных типов; здесь у вас <= и те же типы (правый, левый, верхний и нижний имеют одинаковый тип, я полагаю) – mik

+0

спасибо, да, я только что видел это ... – loki

-1

Похоже, это полезно для блока BigDecimals от Руди Велтиуса. Миллионы десятичных знаков точности и точности.

+1

Звучит совсем не так. Почему ты так думаешь. Считаете ли вы последствия для производительности? Но что более важно, как насчет ответа на вопрос. –