iOS 64비트 프로세서의 fminf 및 fmaxf 버그
문제
공유하고 싶은 64비트 프로세서의 버그를 발견했습니다.
CGFloat test1 = 0.58;
CGFloat test2 = 0.40;
CGFloat value;
value = fmaxf( test1, test2 );
결과는 다음과 같습니다.
값 = 0.5799999833106995
이것은 분명히 반올림 문제이지만 어떤 값이 선택되었는지 확인해야 하는 경우 잘못된 결과를 얻게 됩니다.
if( test1 == value ){
// do something
}
그러나 MIN( A, B ) 또는 MAX( A, B )를 사용하면 예상대로 작동합니다.
나는 이것이 공유할 가치가 있다고 생각했다
감사해요
해결책
이것은 버그와는 관련이 없습니다. fminf
또는 fmaxf
.코드에 버그가 있습니다.
64비트 시스템에서는 CGFloat
형식 정의되어 있습니다. double
, 하지만 당신은 fmaxf
에서 작동하는 함수 float
(아니다 double
), 인수가 단정밀도로 반올림되어 값이 변경됩니다.그러지 마세요.
32비트 시스템에서는 이런 일이 발생하지 않습니다. CGFloat
형식 정의되어 있습니다. float
, 인수 및 반환 유형과 일치 fmaxf
;반올림이 발생하지 않습니다.
대신 다음 중 하나를 포함하십시오. <tgmath.h>
그리고 사용 fmax
없이 f
접미사 또는 사용 float
대신에 CGFloat
.
제휴하지 않습니다 StackOverflow