首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Obj-C中,CGFloat.leastNonzeroMagnitude等价于什么?

在Obj-C中,CGFloat.leastNonzeroMagnitude等价于什么?
EN

Stack Overflow用户
提问于 2022-08-30 06:10:17
回答 2查看 92关注 0票数 3

目标C中的CGFloat.leastNonzeroMagnitude等效值是什么?我搜索了一下,但没有找到任何答案。

EN

回答 2

Stack Overflow用户

发布于 2022-08-30 06:39:42

请注意,文档 of leastNonzeroMagnitude说:

比较小于或等于所有正数,但大于零。如果目标支持低于正常值,则这比leastNormalMagnitude小;否则它们是相等的。

因此,它的值也取决于“目标是否支持低于正常值”。看看实现,我们可以看到:

代码语言:javascript
运行
复制
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,则如下所示:

代码语言:javascript
运行
复制
CGFLOAT_MIN

代码语言:javascript
运行
复制
CGFLOAT_MIN * CGFLOAT_EPSILON
票数 2
EN

Stack Overflow用户

发布于 2022-08-30 06:39:22

苹果并没有提供与CGFloat.leastNonzeroMagnitude相同的目标C常数。

苹果确实提供了CGFLOAT_MIN,这是最小的正非零值。它相当于CGFloat.leastNormalMagnitude。在64位CGFloat系统上,这是2.225073858507201e-308 .

最小的正非零floatdouble存在常数(由double标准指定),其中包括亚型:FLT_TRUE_MIN为1.401298e-45,DBL_TRUE_MIN为4.940656458412465e-324。

苹果提供了一个常数CGFLOAT_IS_DOUBLE,如果CGFloatdouble,则为1,如果是float,则为零。所以您可以检查它来定义您自己的CGFLOAT_TRUE_MIN。你也应该警惕苹果在未来会增加它自己的定义。

代码语言:javascript
运行
复制
#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位版本,则可以简化定义:

代码语言:javascript
运行
复制
#ifndef CGFLOAT_TRUE_MIN
#define CGFLOAT_TRUE_MIN DBL_TRUE_MIN
#endif
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73537840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档