我遇到了一个 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