- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
如何在 Swift 中获取特定数字类型的最小值(跨度)?我的意思是,最短的非零步幅。例如 1
代表 Int
,0.00...001
代表 Double
等...
最佳答案
这已经在单独的评论中得到了部分解决,但将它们放在一起......
不同值之间的最小可能增量是 1。这是整数定义的一部分,因此它是类型的基本方面,没有(也不需要)用于查找它的特殊 API .
(有人可能会争辩说 successor
构成了这样一个 API。但也有人会争辩说,在你可以只使用 1
的地方使用 successor
使得你的代码可读性要差得多。)
没有可能的最小增量。因为浮点类型使用基于指数的表示,所以可表示的 float 之间的间距随指数而变化,如此数字行所示:
该图像来自 What Every Computer Scientist Should Know About Floating-Point Arithmetic ,对于每个使用 float 的人来说都是必不可少的读物。您可以在维基百科的页面中阅读更多关于 Unit in the Last Place 的概念。和 Machine Epsilon . Exploring Binary也有一本关于浮点间距的入门级读物。
回到 Swift — Float
和 Double
类型符合 FloatingPoint
protocol (在 Swift 3 中,目前处于测试阶段)。这定义了 IEEE 754 floating point formats 的特征,其中包括:
最后一个单位,或 ulp
,它告诉你一个数字和下一个更大的可表示数字之间的增量(但对于某些边缘情况)。这与机器 epsilon 相关但不相同,因为它随值缩放。 (ulpOfOne
与其他库所称的机器 epsilon 相同。)
这是一个示例(方便地显示对于 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_EPSILON
和 DBL_EPSILON
被定义为 1.0 和下一个可表示值之间的差异,nextafter
函数找到任何值的增量。
关于swift - 如何在 Swift 中获取特定数字类型的最小值(步幅)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35414156/
我不确定哪种结构布局最适合我的应用程序:共享、打包、std140、std430。我并不是要求对每个信息进行解释,这些信息很容易找到,只是很难弄清楚每个信息对供应商兼容性/性能的影响。如果 shared
如何在 Swift 中获取特定数字类型的最小值(跨度)?我的意思是,最短的非零步幅。例如 1 代表 Int,0.00...001 代表 Double 等... 最佳答案 这已经在单独的评论中得到了部分
有没有办法告诉 numpy 在写入 python pickle 文件时保留非标准步幅? >>> # Create an array with non-standard striding >>> x =
我将图像存储为 2d numpy 数组(可能是多维)。 我可以在那个反射(reflect)二维滑动窗口的数组上创建一个 View ,但是当我 reshape 它以使每一行都是一个扁平化的窗口(行是窗口
我是一名优秀的程序员,十分优秀!