Darwin
里的math.h
定义了很多和数学相关的内容,它在Swift
中也
被进行了module 映射
,因此在Swift 中我们是可以直接使用
的。有了这个保证,我们就不需要担心在进行数学计算的时候会和标准有什么差距。比如,我们可以轻易的使用圆周率来计算周长,也可以使用各种三角函数来完成需要的屏幕位置计算等:
func circlePerimeter(radius: Double) -> Double {
return 2 * M_PI * radius
}
func yPosition(dy: Double, angle: Double) -> Double {
return dy * tan(angle)
}
Swift 除了导入了math.h
的内容以外,也在标准库中对极限情况
的数字做了一些约定,比如我们可以使用Int.max
和Int.min
来取得对应平台的Int 的最大和最小值
。另外在Double
中,我们还有两个很特殊
的值,infinity
和NaN
。
infinity
infinity 代表无穷
,它是类似 1.0 / 0.0
这样的数字表达式的结果。代表数学意义上的无限大
。在这里我们强调了数学意义,是因为受限于计算机系统,其实是没有真正意义上的无穷大的,毕竟这是我们讨论的平台。一个64 位
的系统中,Swift 的Double 能代表的最大的数字大约是1.797693134862315e+308
,而超过这个数字的Double 虽然在数学意义上并不是无穷大,但是也会在判断的时候被认为是无穷:
1.797693134862315e+308 < Double.infinity // true
1.797693134862316e+308 < Double.infinity // false
当然一般来说和无穷大比较大小是没有意义的,虽然在绝大多数情况下我们不会在这个上面栽跟头,但是谁又知道会不会真的遇到这样的情况呢?
NaN
另一个有趣的东西是NaN
,它是“Not a Number”
的简写,可以用来表示某些未被定义的或者出现了错误的运算,比如下面的操作都会产生NaN:
let a = 0.0 / 0.0
print(a) // nan
let b = sqrt(-1.0)
print(b) // -nan
let c = 0.0 * Double.infinity
print(c) // -nan
与NaN 进行运算的结果也将都是NaN。Swift 的Double 中也为我们提供了直接获取一个NaN 的方法,我们可以通过使用Double.nan
来直接获取
一个NaN
。在某些边界条件下,我们可能会希望判断
一个数值是不是NaN
。和其他数字(包括无穷大)相比,NaN 在这点上非常特殊。你不能用NaN 来做相等判断或者大小比较,因为它本身就不是数字
,这类比较就没有意义了。比如对于一个理论上的恒等式 num == num
,在NaN 的情况下就有所不同:
let num = Double.nan
if num == num {
print("Num is \(num)")
} else {
print("NaN")
}
// 输出
// NaN
用判定是否与自己相等的方式就可以判定一个量是不是NaN 了。当然,一个更加容易读懂和简洁的方式是使用Double 的isNaN
或者 Darwin 中的isnan
来判断:
let num = Double.nan
if num.isNaN {
print("Num is \(num)")
} else {
print("NaN")
}
// 输出
// Num is nan
转载:https://blog.csdn.net/LiqunZhang/article/details/115628160