Error en fminf y fmaxf en procesadores iOS de 64 bits
Pregunta
Encontré un error con los procesadores de 64 bits que quería compartir.
CGFloat test1 = 0.58;
CGFloat test2 = 0.40;
CGFloat value;
value = fmaxf( test1, test2 );
El resultado sería:
valor = 0,5799999833106995
Obviamente, esto es un problema de redondeo, pero si necesitara verificar qué valor se eligió, obtendría un resultado erróneo.
if( test1 == value ){
// do something
}
sin embargo, si usa MIN( A, B ) o MAX( A, B ), funcionará como se esperaba.
Pensé que valía la pena compartirlo.
Gracias
Solución
Esto no tiene nada que ver con un error en fminf
o fmaxf
.Hay un error en tu código.
En sistemas de 64 bits, CGFloat
está definido como tipo double
, pero estás usando el fmaxf
función que opera sobre float
(no double
), lo que hace que sus argumentos se redondeen a precisión simple, cambiando así el valor.No hagas eso.
En sistemas de 32 bits, esto no sucede porque CGFloat
está definido como tipo float
, haciendo coincidir el argumento y el tipo de retorno de fmaxf
;no se produce redondeo.
En su lugar, incluya <tgmath.h>
y use fmax
sin el f
sufijo o uso float
en lugar de CGFloat
.