문제

공유하고 싶은 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.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top