飞道的博客

Swift - 数学和数字

238人阅读  评论(0)

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.maxInt.min 来取得对应平台的Int 的最大和最小值。另外在Double 中,我们还有两个很特殊的值,infinityNaN

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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场