gpt4 book ai didi

swift - 如何在 Swift 中获取特定数字类型的最小值(步幅)?

转载 作者:搜寻专家 更新时间:2023-11-01 07:26:59 25 4
gpt4 key购买 nike

如何在 Swift 中获取特定数字类型的最小值(跨度)?我的意思是,最短的非零步幅。例如 1 代表 Int0.00...001 代表 Double 等...

最佳答案

这已经在单独的评论中得到了部分解决,但将它们放在一起......

对于整数类型:

不同值之间的最小可能增量是 1。这是整数定义的一部分,因此它是类型的基本方面,没有(也不需要)用于查找它的特殊 API .

(有人可能会争辩说 successor 构成了这样一个 API。但也有人会争辩说,在你可以只使用 1 的地方使用 successor 使得你的代码可读性要差得多。)

对于浮点类型:

没有可能的最小增量。因为浮点类型使用基于指数的表示,所以可表示的 float 之间的间距随指数而变化,如此数字行所示:

density of floating point numbers该图像来自 What Every Computer Scientist Should Know About Floating-Point Arithmetic ,对于每个使用 float 的人来说都是必不可少的读物。您可以在维基百科的页面中阅读更多关于 Unit in the Last Place 的概念。和 Machine Epsilon . Exploring Binary也有一本关于浮点间距的入门级读物。

回到 Swift — FloatDouble 类型符合 FloatingPoint protocol (在 Swift 3 中,目前处于测试阶段)。这定义了 IEEE 754 floating point formats 的特征,其中包括:

  • 最后一个单位,或 ulp ,它告诉你一个数字和下一个更大的可表示数字之间的增量(但对于某些边缘情况)。这与机器 epsilon 相关但不相同,因为它随值缩放。 (ulpOfOne 与其他库所称的机器 epsilon 相同。)

  • nextUpnextDown ,它会告诉您最接近的更大或更小的可表示数字。

这是一个示例(方便地显示对于 32 位 Float,最小增量比您想象的更快地变大):

let ichi: Float = 1.0
ichi.ulp // -> 1.192093e-07
ichi.nextUp // -> 1.00000012

let man: Float = 10_000
man.ulp // -> 10000
man.nextUp // -> 10000.001

let oku: Float = 100_000_000
oku.ulp // -> 8
oku.nextUp // -> 100000008.0

在 Swift 2 中,没有 FloatingPoint 协议(protocol),但您可以使用从 C 导入的等效 POSIX 常量/函数:FLT_EPSILONDBL_EPSILON 被定义为 1.0 和下一个可表示值之间的差异,nextafter函数找到任何值的增量。

关于swift - 如何在 Swift 中获取特定数字类型的最小值(步幅)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35414156/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com