# 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 運算 也就是 `~` 運算, 一個數字如果取 `~` 運算, 則所有位元反轉。 但是這個會牽扯到負數的位元運算, 所以這裡先不講。 基本上學到這裡已經很後面了, **位元運算**的主要功能就是省時間, 現在的程式碼還沒有必要用到**位元運算**, 所以有個概念就好。