Сравнения с плавающей запятой являются собственной шириной для всех архитектур 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 - это то, что я бы хотелрассмотрим наиболее близкую к эталонной реализации решение общего назначения в этом контексте.