这导致我的App采取行动。此错误发生在此行modff(floatIndex, &intIndex);
我需要做些什么才能解决此问题?
编辑:这是因为& intIndex
- (BOOL)isFloatIndexBetween:(CGFloat)floatIndex {
CGFloat intIndex, restIndex;
restIndex = modff(floatIndex, &intIndex);
BOOL isBetween = fabsf(restIndex - 0.5f) < EPSILON;
return isBetween;
}
答案 0 :(得分:3)
我记得CGFloat在32位设备上定义为float,在64位设备上定义为double。因此,您不希望在调用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;
}
答案 1 :(得分:1)
您正在将CGFloat
s(系统上的typedef&#39; ed传递给double
)传递给期望float
的函数。
您可以分别将modff
和fabsf
更改为modf
和fabs
(更慢但更精确),或更改intIndex
和{{1成为restIndex
而不是float
s(更快但不太精确)。
答案 2 :(得分:1)
学会说编译器错误/警告是非常宝贵的技能。在这种情况下,它告诉您modff
期望float
(即单精度浮点数),但是您传递CGFloat
(这是typedef'd为double
,这是一个双精度浮点数)。正如NobodyNada所说,您可以更改您正在使用的功能或intIndex
类型。
答案 3 :(得分:0)
使用特定于体系结构的类型(如CGFloat
)时,避免这些类型的警告和错误的最简单方法可能是将#import <tgmath.h>
放入预编译的头文件或此文件的导入中。这样就可以使用底层C函数的类型泛型版本。在这种情况下,它会使您的警告消失,而不会更改任何代码。然后,只需要确保精度是你想要的。
答案 4 :(得分:0)
如果您使用的是64位体系结构(如arm64),那么您应该使用CGFloat,因为它被定义为double,因此它是一个8字节的浮点数,而float是一个4字节的浮点数。
所以你应该根据架构使用它们。