目标C中的CGFloat.leastNonzeroMagnitude
等效值是什么?我搜索了一下,但没有找到任何答案。
发布于 2022-08-30 06:39:42
请注意,文档 of leastNonzeroMagnitude
说:
比较小于或等于所有正数,但大于零。如果目标支持低于正常值,则这比
leastNormalMagnitude
小;否则它们是相等的。
因此,它的值也取决于“目标是否支持低于正常值”。看看实现,我们可以看到:
public static var leastNonzeroMagnitude: ${Self} {
#if arch(arm)
// On 32b arm, the default FPCR has subnormals flushed to zero.
return leastNormalMagnitude
#else
return leastNormalMagnitude * ulpOfOne
#endif
}
事实证明,ARM是不“支持低于正常值”的目标。:)
如果将这两个分支分别转化为目标C,则如下所示:
CGFLOAT_MIN
和
CGFLOAT_MIN * CGFLOAT_EPSILON
发布于 2022-08-30 06:39:22
苹果并没有提供与CGFloat.leastNonzeroMagnitude
相同的目标C常数。
苹果确实提供了CGFLOAT_MIN
,这是最小的正正非零值。它相当于CGFloat.leastNormalMagnitude
。在64位CGFloat
系统上,这是2.225073858507201e-308 .
最小的正非零float
和double
存在常数(由double
标准指定),其中包括亚型:FLT_TRUE_MIN
为1.401298e-45,DBL_TRUE_MIN
为4.940656458412465e-324。
苹果提供了一个常数CGFLOAT_IS_DOUBLE
,如果CGFloat
是double
,则为1,如果是float
,则为零。所以您可以检查它来定义您自己的CGFLOAT_TRUE_MIN
。你也应该警惕苹果在未来会增加它自己的定义。
#ifndef CGFLOAT_TRUE_MIN
#if CGFLOAT_IS_DOUBLE
#define CGFLOAT_TRUE_MIN DBL_TRUE_MIN
#else
#define CGFLOAT_TRUE_MIN FLT_TRUE_MIN
#endif
#endif
但是唯一支持使用32位CGFloat
的平台是watchOS,如果您使用的是Objective,那么您不太可能瞄准watchOS。如果您只针对iOS/macOS/tvOS的64位版本,则可以简化定义:
#ifndef CGFLOAT_TRUE_MIN
#define CGFLOAT_TRUE_MIN DBL_TRUE_MIN
#endif
https://stackoverflow.com/questions/73537840
复制相似问题