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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top