Bug em fminf e fmaxf em processadores iOS de 64 bits
Pergunta
Me deparei com um bug nos processadores de 64 bits que queria compartilhar.
CGFloat test1 = 0.58;
CGFloat test2 = 0.40;
CGFloat value;
value = fmaxf( test1, test2 );
O resultado seria:
valor = 0,5799999833106995
Obviamente, isso é um problema de arredondamento, mas se você precisasse verificar qual valor foi escolhido, obteria um resultado errado.
if( test1 == value ){
// do something
}
no entanto, se você usar MIN( A, B ) ou MAX( A, B ) funcionará conforme o esperado.
Achei que valia a pena compartilhar isso
Obrigado
Solução
Isso não tem nada a ver com um bug no fminf
ou fmaxf
.Há um bug no seu código.
Em sistemas de 64 bits, CGFloat
é digitado para double
, mas você está usando o fmaxf
função, que opera em float
(não double
), o que faz com que seus argumentos sejam arredondados para precisão única, alterando assim o valor.Não faça isso.
Em sistemas de 32 bits, isso não acontece porque CGFloat
é digitado para float
, correspondendo ao argumento e ao tipo de retorno de fmaxf
;nenhum arredondamento ocorre.
Em vez disso, inclua <tgmath.h>
E use fmax
sem o f
sufixo ou use float
em vez de CGFloat
.