Domanda

Mi sono imbattuto in un bug con i processori a 64 bit che volevo condividere.

CGFloat test1 = 0.58;
CGFloat test2 = 0.40;
CGFloat value;

value = fmaxf( test1, test2 );

Il risultato sarebbe:
valore = 0,5799999833106995

Questo ovviamente è un problema di arrotondamento, ma se avessi bisogno di verificare quale valore è stato scelto otterresti un risultato errato.

if( test1 == value ){
 // do something
}

tuttavia, se utilizzi MIN( A, B ) o MAX( A, B ) funzionerebbe come previsto.
Ho pensato che valesse la pena condividerlo

Grazie

È stato utile?

Soluzione

Questo non ha nulla a che fare con un bug fminf O fmaxf.C'è un bug nel tuo codice.

Sui sistemi a 64 bit, CGFloat è definito come double, ma stai utilizzando il file fmaxf funzione, su cui opera float (non double), che fa sì che i suoi argomenti vengano arrotondati alla precisione singola, modificando così il valore.Non farlo.

Sui sistemi a 32 bit, ciò non accade perché CGFloat è definito come float, corrispondente all'argomento e al tipo restituito di fmaxf;non si verifica alcun arrotondamento.

Invece, includi <tgmath.h> e utilizzare fmax senza il f suffisso o uso float invece di CGFloat.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top