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