2011-11-02 32 views
6

de Apple CoreGraphics.framework, CGGeometry.h:comparación flotador (igualdad) en CoreGraphics

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

¿Por qué ellos (Apple) se comparan con los flotadores ==? No puedo creer que esto sea un error. Entonces, ¿puedes explicarme? (esperaba algo como fabs(size1.width - size2.width) < 0.001).

+2

No estoy seguro de cuál es el caso de uso para usar '==' allí, pero creo que justifica pedirle a Apple que lo explique en la documentación. –

Respuesta

3

Las comparaciones de puntos flotantes son de ancho nativo en todas las arquitecturas OSX e iOS.

Para float, que viene a:

i386, x86_64:

  • 32 bit de registro XMM (o la memoria de segundo operando)
  • usando un instrucciones de la familia de ucomiss

ARM:

  • 32 bit de registro
  • utilizando instrucciones de la misma familia que vcmp

Algunos de los problemas de comparación de punto flotante se han eliminado mediante la restricción de almacenamiento a 32/64 para estos tipos. Otras plataformas pueden usar la FPU nativa de 80 bits a menudo (ejemplo). En OS X, las instrucciones SSE son preferidas, y usan anchos naturales. Entonces, eso reduce muchos de los problemas de comparación de coma flotante.

Pero todavía hay margen de error, o veces cuando se favorecerá la aproximación. Un detalle oculto sobre los valores de los tipos de CGGeometry es que pueden redondearse a un entero cercano (es posible que desee hacerlo usted mismo en algunos casos).

Dada la gama de CGFloat (float o double -x86_64) y los valores típicos, es razonable asumir los valores redondeados generalmente representarse con precisión suficiente, de manera que los resultados serán adecuadamente comparable en la mayoría de los casos. Por lo tanto, es "bastante seguro", "bastante preciso" y "bastante rápido" dentro de esos límites.

Todavía hay ocasiones en las que es posible que prefiera las comparaciones aproximadas en los cálculos de geometría, pero la implementación de apple es lo que consideraría más cercano a una implementación de referencia para la solución de propósito general en este contexto.