仔細的演算法
A. 誰給說說派(圓周率)的4中演算法
為什麼要算 PI?計算機最原始的用途就是進行人類無法完成的復雜運算,算 PI 就是這樣的運算之一。雖然算 PI 本身沒有多大的實際意義,但是對於計算機愛好者來說作為一種編程的挑戰,還是很有意思的。算 PI 看似簡單,其實它還牽涉到一些有用的數學知識。第一類演算法:arctan 的級數展開PI/4 = 4 arctan(1/5) - arctan(1/239) (1)arctan(x) = x - x3/3 + x5/5 - x7/7 + .... (2)很容易想到,要得到超高精度的 PI 值,實數在計算機中必須以數組的形式進行存取,數組的大小跟所需的有效位數成正比。在這個演算法中,PI 的有效位數 n 隨 (2) 的求和項數線性增加。而為計算 (2) 中的每一項,需要進行超高精度實數除以小整數(52, 2392, 2k+1)的循環,循環所需次數也跟 n 成正比。所以,這個演算法總的時間復雜度為 O(n2)。這個演算法的優點是簡單,而且只需要進行整數運算。下面給出我寫的算 PI 程序。在程序中,我採用了一些提高速度的措施:超高精度實數以數組的形式進行存取,數組元素的類型為 64 位整數(long long),每個元素儲存 12 個十進制位;對 xk (x = 1/5, 1/239) 的頭部和尾部的 0 的數量進行估計,只對非 0 的部分進行計算。另外,還有許多跟 (1) 類似的式子,但不常用。例如:PI/4 = arctan(1/2) + arctan(1/3)PI/4 = 8 arctan(1/10) - arctan(1/239) - 4 arctan(1/515)第二類演算法:與 1/PI 有關的級數1/PI = (sqrt(8) / 9801) sumk=0~inf { [(4k)! (1103 + 26390k)] / [(k!)4 3964k] } (Ramanujan)1/PI = (sqrt(10005) / 4270934400) sumk=0~inf { [(6k)! (13591409 + 545140134k)] / [(k!)3 (3k)! (-640320)3k] } (Chudnovsky)以上兩個級數(還有其它類似形式的級數,但不常用)比起 arctan 的泰勒級數要復雜得多。雖然仍然是線性收斂,總的時間復雜度也仍然是 O(n2),但它們的收斂速度相當快, (Ramanujan) 每項可以增加 8 位有效數字, (Chudnovsky) 每項可以增加 14 位。在這個演算法中,除了要進行超高精度實數(數組形式)和小整數的運算外,還有一次超高精度實數的開方和倒數的運算,這需要用到 FFT(快速傅立葉變換),在下文敘述。第三類演算法:算術幾何平均值和迭代法算術幾何平均值(Arithmetic-Geometric Mean, AGM) M(a, b) 定義如下:a0 = a, b0 = b
ak = (ak-1 + bk-1) / 2, bk = sqrt(ak-1 bk-1)
M(a, b) = limk->inf ak = limk->inf bk然後,由橢圓積分的一系列理論(抱歉,過程我不懂)可以推導出如下公式:a0 = 1, b0 = 1 / sqrt(2)
1/PI = { 1 - sumk=0~inf [2k (ak2 - bk2)] } / 2M(a0, b0)2 (AGM)根據這條公式可以制定適當的迭代演算法。在迭代過程中,有效位數隨迭代次數按 2 的指數增加,即每迭代一次有效位數乘 2。演算法中的超高精度實數的乘、除、開方等運算需要使用 FFT,在下文敘述。綜合考慮 FFT 的時間復雜度,整個演算法的時間復雜度約為 O(n log(n)2)。除了 (AGM) 以外,還有其它的迭代序列,它們具有同樣的時間復雜度。例如下面的這個序列將按 4 的指數收斂到 1/PI:y0 = sqrt(2) - 1, a0 = 6 - 4 sqrt(2)
yk = [1 - sqrt(sqrt(1 - yk-14))] / [1 + sqrt(sqrt(1 - yk-14))], ak = (1 + yk)4 ak-1 - 22k+1 yk (1 + yk + yk2)
1/PI = limk->inf ak (Borwein)FFT如上所述,第二和第三類演算法不可避免地要涉及超高精度實數(數組形式存取的多位數)的乘、除、開方等運算。多位數乘法如果按照常規方法來計算,逐位相乘然後相加,其時間復雜度將達到 O(n2)。使用 FFT 可大大減少計算量。設有復數數組 a[k] 和 b[k] (k=0~n-1),正向和反向的離散傅立葉變換(DFT)定義如下: (i = sqrt(-1))b = FFTforward(a) : b[k] = sumj=0~n-1 ( a[j] e-i*j*2PI*k/n ) (3)b = FFTbackward(a) : b[k] = (1/n) sumj=0~n-1 ( a[j] ei*j*2PI*k/n ) (4)(3) 和 (4) 中的 (1/n) 可以放在任何一個式子中,也可以拆成 (1/sqrt(n)) 同時放在兩個式子中,目的是保證正向和反向傅立葉變換以後不會相差一個因子。當 n 的所有素因子均為小整數,尤其是當 n 為 2 的整數次冪的時候,使用適當的演算法經過仔細的協調,可以避免多餘的計算,使離散傅立葉變換 (3) 和 (4) 減少至 O(n log(n)) 的時間復雜度,即所謂的快速傅立葉變換(FFT)。具體的細節請查閱相關書籍。下面給出我寫的一段 FFT 程序,僅供參考。另外也有已經開發的 FFT 函數庫,例如 FFTW ,可以直接使用。fft.cpp FFT 的 C++ 源程序利用 FFT,要計算 n1 位和 n2 位的兩個多位數乘法,可以這樣進行:開辟兩個長度為 n(n>=n1+n2,取 2m 最佳) 的復數數組,將兩個多位數從低位到高位分別填入,高位補 0。對兩個數組分別進行正向傅立葉變換。將得到的兩個變換後的數組的對應項相乘,然後進行反向傅立葉變換,最後得到一個結果數組。由於傅立葉變換是在復數域中進行的,因此還要對結果數組進行取整和進位,才能得到最終的乘積。值得留意的是傅立葉變換的精度問題。我們知道,在計算機中實數用單精度數或雙精度數表示,它們會存在一定的誤差。在計算多位數乘法時,n 往往是一個很大的數字,傅立葉變換過程中需要對數組的每一項進行求和,如何保證精度帶來的誤差不會因為求和而超出允許的范圍?我的觀點是必須使用雙精度實數,而且由於統計特性,精度帶來的誤差在求和過程中不會很大,一般不會影響計算的正確性。如果需要保證計算的正確性,我想到兩種檢查方法。第一種是取模驗算。例如,如果乘數和被乘數對 17 的模分別是 8 和 6,那麼積對 17 的模就應該是 14。第二種是檢查運算結果中浮點數偏離整數的最大值。如果偏差只有比如 10-3 量級,我們可以認為這個尺度的乘法運算很安全;如果偏差達到 0.5,說明運算已經出錯了;如果偏差達到 0.1 量級,那也比較危險,也許換個別的乘數和被乘數就溢出了。多位數的倒數和開方可以通過牛頓迭代求根法轉化為乘法運算。例如,要計算 x = 1/a ,根據牛頓迭代法令 f(x) = 1/x - a ,可以得到以下迭代序列:x0 ~= 1/a
xk = xk-1 - f(xk-1)/f'(xk-1) = 2xk-1 - axk-12 (5)要計算 x = sqrt(a) ,可以先計算 x = 1 / sqrt(a) ,令 f(x) = 1/x2 - a ,可以得到以下迭代序列:x0 ~= 1 / sqrt(a)
xk = xk-1 - f(xk-1)/f'(xk-1) = (3/2)xk-1 - (1/2)axk-13 (6)(5) 和 (6) 均以 2 的指數收斂到所求結果。還存在其它更復雜一些的迭代序列,它們以更高的指數收斂,在此不提。不過需要提醒的是,跟 (AGM) 不同,這里 (5) 和 (6) 中的 x0 只是 1/a 和 1 / sqrt(a) 的約值,在前幾次的迭代中不必進行滿 n 位數的乘法運算,因而可以減少計算量。
B. 詞語造句:用正弦造句(約30個)
正弦拼音: zheng xian正弦解釋: 直角三角形任意一個銳角的對邊和斜邊的比,叫做該銳角的正弦,用sin(角)表示。參看〖三角函數〗。
正弦造句: 1、這就是以上的SAI原理中提到的正弦波浪線。
2、上面,我們在同一圖中繪制了正弦和餘弦曲線。
3、現在,假設您想進行一些簡單的處理,比如寫出這些角度的正弦值。
4、假設我們同時繪制正弦和餘弦曲線。
5、每一個組件都是一種算數指令,諸如加、減、乘、餘弦、正弦。
6、當然我也可以在這里,用正弦曲線計算,希望你們能認識到它。
7、我們從簡單的正弦曲線開始,將其定製為我們所希望看到的形狀。
8、我認為實際上應該是正弦。
9、正弦波形賦予了通過水道的結構輪廓的形狀。
10、泰勒級數的效率也無法與現代桌面晶元的內置正弦函數相比。
11、一個能很好地展示這類表單用途的例子是如下所示的這個簡單的正弦計算器。
12、現在你們聽到的聲音,你們聽到的頻率,會以正弦曲線而變化。
13、我還聽到了餘弦,還有正弦。
14、數學解釋說,正弦曲線是這樣的。
15、要准確快速地計算正弦函數和其他函數,需要非常仔細的演算法,專門用於避免無意地將小的誤差變成大的錯誤。
16、此外,一個粗略的正弦曲線圖表可以在每天或每年的平均每日溫度平面圖表中看到,雖然這個圖形可能和倒置的餘弦波看起來很像。
17、假設我們只想看到一個正弦曲線周期。
18、我們使用簡單的正弦波模式作為一個簡單原創的網頁設計和創建單頁布局的基礎。
19、他們認為水沾在身上靠的是身體表面的親和力,正弦波狀的抖動動作製造了水脫離身體的離心力。
20、這是我們正在採用的一種類似正弦曲線一樣的工作方式。
21、XSLT沒有正弦函數。
22、因為在r和v中,有交叉乘積,所以得到正弦值。
23、點P,速度向量,垂直於直線,所以該角的正弦值為。
24、雙曲正弦、雙曲餘弦和雙曲正切函數也會以常見或特殊形式出現在各種計算中。
25、例如,讓我們考慮一下正弦波,也即正弦曲線這樣一個描述平穩反復振盪的數學函數。
26、好的,讓我們試著把等式,帶入正弦函數,或者餘弦數來做,你喜歡哪個都行。
27、由於該辨識方法沒有將繼電和過程輸出近似為正弦信號,獲得的SOPDT模型能更准確地反映過程的動態特性。
28、本文改進的偶函數和奇函數的AFT演算法還分別可以用來計算離散餘弦變換(DCT)和離散正弦變換(DST)。
C. 建築木工梁幫怎麼算,50的梁,11的灰厚,梁底5公分,求仔細演算法
不用管粱底,梁梆=梁高-板厚
這是正常的梁梆,如果有降板,就是
梁梆=梁高-板厚-降板高度
這是坐梁梆如果是包梁梆就不一樣了,要在坐梁梆的基礎上加上方木的厚度