-1

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

谢谢

4

1 回答 1

3

fminf这与or中的错误无关fmaxf。您的代码中有一个错误。

在 64 位系统上,CGFloat是 typedef'd to double,但您使用的是对(not )fmaxf进行操作的函数,这会导致其参数四舍五入为单精度,从而更改值。不要那样做。floatdouble

在 32 位系统上,这不会发生,因为CGFloattypedef'd to匹配;float的参数和返回类型 fmaxf不发生舍入。

相反,要么包含<tgmath.h>并使用fmax不带f后缀,要么使用float而不是CGFloat.

于 2014-01-10T12:59:28.510 回答