我遇到了一个我想分享的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),它将按预期工作。
我认为这是值得分享的
由于
答案 0 :(得分:3)
这与fminf
或fmaxf
中的错误无关。您的代码中存在错误。
在64位系统上,CGFloat
是double
的typedef,但你使用fmaxf
函数,该函数在float
上运行(不是{{ 1}}),使其参数四舍五入为单精度,从而改变值。不要那样做。
在32位系统上,这不会发生,因为double
是CGFloat
的typedef,匹配float
的参数和返回类型;没有四舍五入。
相反,要么包含fmaxf
,要么使用不带<tgmath.h>
后缀的fmax
,要么使用f
代替float
。