这导致我的应用程序运行。 此错误发生在此行modff(floatIndex, &intIndex);
我需要做什么来解决此问题?
编辑:这是因为&intIndex
- (BOOL)isFloatIndexBetween:(CGFloat)floatIndex {
CGFloat intIndex, restIndex;
restIndex = modff(floatIndex, &intIndex);
BOOL isBetween = fabsf(restIndex - 0.5f) < EPSILON;
return isBetween;
}
我记得 CGFloat 在 32 位设备上定义为浮点数,在 64 位设备上定义为双精度。因此,您不想在调用 modff() 时使用 CGFloat。相反,请使用特定类型声明参数,并使用强制转换。
像这样的东西(在这种情况下,我使用的是modf和所有浮点变量。
- (BOOL)isFloatIndexBetween:(CGFloat)floatIndex
{
float restIndex;
float first, second;
first = (float) floatIndex;
restIndex = modf(first, &second);
BOOL isBetween = fabsf(restIndex - 0.5f) < EPSILON;
return isBetween;
}
学习说编译器错误/警告是一项宝贵的技能。在这种情况下,它告诉您modff
需要一个float
(即单精度浮点数),但您正在传递它一个CGFloat
(它是typedef'd作为double
,这是一个双精度浮点数)。正如NobodyNada所说,您可以更改正在使用的功能或类型(如果intIndex
)。
您正在将CGFloat
s(typedef'ed to double
on your system)传递给期望float
s的函数。
您可以将modff
和fabsf
分别更改为 modf
和 fabs
(速度较慢但更精确),也可以将intIndex
和restIndex
更改为 float
s 而不是 double
s(更快但不太精确)。
在使用体系结构特定类型(如CGFloat
)时,避免这些类型的警告和错误的最简单方法可能是将#import <tgmath.h>
放在预编译标头或此文件的导入中。这样就使用了底层 C 函数的类型泛型版本。在这种情况下,它会使您的警告消失,而无需任何代码更改。然后,只需确保精度是您想要的。
如果您使用的是 64 位架构(如 arm64),那么您应该使用 CGFloat,因为它被定义为双精度数,因此是 8 字节浮点数,而浮点数是 4 字节浮点数。
因此,您应该根据体系结构使用这些。