# FDCSC110 Dec3 Handout - Math & Operators
---
之所以會想要介紹這個單元是因為 `Python` 最大的用途就是計算!
有很多的經濟、物理、太空等需要大量計算的科系都會使用 `Python` (還有 `Matlab` 啦)
還有探究課也會用到 :poop:
:::spoiler `code`
```python=
import math
import os
sin = math.sin
cos = math.cos
tan = math.tan
arcsin = math.asin
PI = math.pi
C = 16
H = 0
W = 15
deg = 0
L = 25
def deg_to_rad(x):
return x*PI/180
def rad_to_deg(x):
return x*180/PI
def calL(x):
return (H + C*sin(x))*tan(x) + C*cos(x) - W
def calD(x):
K = L+W
return arcsin(((4*x*x*C*C-4*(x*x+K*K)*(C*C-K*K))**(1/2)-2*x*C)/(2*(x*x+K*K)))
if __name__ == '__main__':
while True:
H, deg = map(float, input('H, deg = ').strip().split())
print('L = {}cm'.format(calL(deg_to_rad(deg))))
print('RAD = {}'.format(calD(H)))
print('DEG = {}'.format(rad_to_deg(calD(H))))
print('tan(PI/2-x) = {}'.format(tan(PI/2-deg_to_rad(deg))))
os.system('pause')
```
:::
## Functions from `math`
### 數論衍生函數
#### `ceil(x)`
回傳大於等於 `x` 的最小整數
#### `floor(x)`
回傳小於等於 `x` 的最大整數
#### `comb(n, k)`
回傳 $C_{k}^{n}$
#### `factorial(x)`
回傳 `x` 的階乘
#### `frexp(x, y)`
令 $n = a\times 2^b$,以 `tuple` 回傳 `(a, b)`
#### `ldexp(x, y)`
回傳 $x\times 2^y$,為 `frexp()` 的反函數
#### `fsum(l)`
更精準的計算串列 `l` 裡面的數字總和
#### `gcd(...)`
回傳引數的最大公因數
#### `lcm(...)`
計算引數的最大公因數
#### `nextafter(x, y)`
如果 $x$ 較小回傳 $\lim \limits_{k\to x^{+}} k$,否則回傳 $\lim \limits_{k\to x^{-}} k$
### 指數與對數函數
#### `exp(x)`
回傳 $e^x$
#### `expml(x)`
回傳 $e^x - 1$,比 `exp(x)-1` 精準
#### `log(x, b)`
回傳 $\log_{b} x$,如果 $b$ 沒有參數,則使用預設值 $e$
#### `log1p(x)`
回傳 $\ln (x+1)$,針對 $x$ 趨近於 $0$ 時使用 ($x$ 極小時)
#### `log2(x)`
回傳 $\log_{2} x$,比 `log(x, 2)` 精準
#### `pow(x, y)`
回傳 $x^y$,在 $x=1$ 或 $y=0$ 永遠回傳 $1$,不可計算虛數,以 `float(x)**float(y)` 進行計算
#### `sqrt(x)`
回傳 $\sqrt{x}$,可以使用 `x**0.5`、`pow(x, 0.5)` 取代
### 三角函數
#### `sin(x)`
回傳 $\sin x$
#### `cos(x)`
回傳 $\cos x$
#### `tan(x)`
回傳 $\tan x$
#### `asin(x)`
回傳 $\sin^{-1} x$,回傳值介於 $\frac{\pi}{2}$ 和 $-\frac{\pi}{2}$ 之間
#### `acos(x)`
回傳 $\cos^{-1} x$,回傳值介於 $0$ 和 $\pi$ 之間
#### `atan(x)`
回傳 $\tan^{-1} x$,回傳值介於 $\frac{\pi}{2}$ 和 $-\frac{\pi}{2}$ 之間
#### `atan2(x)`
回傳 $\tan^{-1} x$,回傳值介於 $\pi$ 和 $-\pi$ 之間
### 向量長度衍生函數
#### `dist(x, y)`
`x`、`y` 皆為 `tuple`,回傳 $\lvert \stackrel\longrightarrow{xy} \rvert$
#### `hypot(...)`
令帶入的引數為 $a_1、a_2、...、a_n$,且 $\stackrel\longrightarrow{A} = (a_1, a_2, ..., a_n)$,則回傳 $\lvert \stackrel\longrightarrow{OA} \rvert$
### 角度轉換
#### `degrees(x)`
回傳 `x` 的度度量
#### `radians(x)`
回傳 `x` 的弳度
### 雙曲函數
#### `sinh(x)`
回傳 $\sinh x$
#### `cosh(x)`
回傳 $\cosh x$
#### `tanh(x)`
回傳 $\tanh x$
#### `asinh(x)`
回傳 $\sinh^{-1} x$
#### `acosh(x)`
回傳 $\cosh^{-1} x$
#### `atanh(x)`
回傳 $\tanh^{-1} x$
### 常數
有 $\pi$、$e$。
#### `tau`
相當於 $2\pi$
#### `inf`
相當於 $\infty$
#### `nan`
相當於 `無意義`
## Operators
因為大部分的運算子之前都上過了,
所以這裡著重在**位元運算**。
原則上所有整數 $z$ 都可以被表示為 $\sum \limits_{k=0}^{\infty} a_i\times 2^k$,其中 $a_i\in \{0, 1\}$,
電腦就是以此原則把 $2$ 進位轉換成 $10$ 進位。
舉例 ${10}_{(10)} = {1010}_{(2)}$。
負數的轉換比較複雜,這裡暫時不講
**位元運算子**主要有 $4$ 個,分別是 `&`、`|`、`^`、`~`。
### AND 運算
也就是 `&` 運算,
如果兩個數字取 `&`,
在同一個位元的數字如果其中一個有 $0$,
則該位元就會是 $0$,
反之就會是 $1$。
舉例 `2&1` 會等於 `0`
### OR 運算
也就是 `|` 運算,
如果兩個數字取 `|`,
在同一個位元的數字如果其中一個有 $1$,
則該位元就會是 $1$,
反之就會是 $0$。
舉例 `2&1` 會等於 `3`
### XOR 運算
也就是 `^` 運算,
如果兩個數字取 `^`,
在同一個位元的數字如果值相同
則該位元就會是 $0$,
反之就會是 $1$。
舉例 `2^1` 會等於 `3`
### NOT 運算
也就是 `~` 運算,
一個數字如果取 `~` 運算,
則所有位元反轉。
但是這個會牽扯到負數的位元運算,
所以這裡先不講。
基本上學到這裡已經很後面了,
**位元運算**的主要功能就是省時間,
現在的程式碼還沒有必要用到**位元運算**,
所以有個概念就好。