iOS 64位处理器上的fminf和fmaxf中的错误

时间:2014-01-10 12:53:35

标签: ios 64-bit arm64

我遇到了一个我想分享的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),它将按预期工作。
我认为这是值得分享的

由于

1 个答案:

答案 0 :(得分:3)

这与fminffmaxf中的错误无关。您的代码中存在错误。

在64位系统上,CGFloatdouble的typedef,但你使用fmaxf函数,该函数在float上运行(不是{{ 1}}),使其参数四舍五入为单精度,从而改变值。不要那样做。

在32位系统上,这不会发生,因为doubleCGFloat的typedef,匹配float的参数和返回类型;没有四舍五入。

相反,要么包含fmaxf,要么使用不带<tgmath.h>后缀的fmax,要么使用f代替float