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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top