Поплавковое сравнение (равенство) в CoreGraphics - PullRequest
6 голосов
/ 02 ноября 2011

Apple CoreGraphics.framework, CGGeometry.h:

CG_INLINE bool __CGSizeEqualToSize(CGSize size1, CGSize size2)
{
    return size1.width == size2.width && size1.height == size2.height;
}
#define CGSizeEqualToSize __CGSizeEqualToSize

Почему они (Apple) сравнивают поплавки с ==?Я не могу поверить, что это ошибка.Так ты можешь мне объяснить?(Я ожидал что-то вроде fabs(size1.width - size2.width) < 0.001).

1 Ответ

3 голосов
/ 07 ноября 2011

Сравнения с плавающей запятой являются собственной шириной для всех архитектур OSX и iOS.

Для float, что означает:

i386, x86_64:

  • 32-битный регистр XMM (или память для второго операнда)
  • с использованием инструкций из семейства ucomiss

ARM:

  • 32-битный регистр
  • с использованием инструкций в том же семействе, что и vcmp

Некоторые проблемы сравнения с плавающей запятой были удалены путем ограничения памятидо 32/64 для этих типов.Другие платформы могут часто использовать собственный 80-битный FPU (пример).На OS X инструкции SSE предпочтительнее, и они используют естественную ширину.Таким образом, это уменьшает многие проблемы сравнения с плавающей запятой.

Но все еще есть место для ошибки или времен, когда вы предпочтете приближение.Одна скрытая деталь в значениях типов CGGeometry заключается в том, что они могут быть округлены до ближайшего целого числа (в некоторых случаях вы можете захотеть сделать это самостоятельно).

Учитывая диапазон значений CGFloat (float или double)-x86_64) и типичные значения, разумно предположить, что округленные значения, как правило, представляются достаточно точно, так что результаты будут соответственно сопоставимы в большинстве случаев.Следовательно, он «довольно безопасен», «довольно точен» и «довольно быстр» в этих пределах.

Бывают моменты, когда вы можете предпочесть приблизительные сравнения в вычислениях геометрии, но реализация Apple - это то, что я бы хотелрассмотрим наиболее близкую к эталонной реализации решение общего назначения в этом контексте.

...