回覆列表
  • 1 # 使用者2062096427531

    math.h 裡的函式都是定義在 libm 裡,而每個 libm 實現都不同gcc 的 glibm 中數學函式的實現完全是平臺依存的,在 x86 機器上,能呼叫 FPU 指令的就用 FPU(比如 sqrt() 就實際上呼叫 FSQRT,log() 呼叫的是 FYL2X),否則再自己實現如果需要軟體實現,方法基本上是泰勒級數。當然對於 sin 這類,可以用專門的最佳化演算法,比如 CORDICCPU 中的電路基本上也就是泰勒級數。下面介紹一下 CORDIC 演算法。CORDIC 最初是用來算 的。由於這個值本質上是點 的幅角,因此我們可以用一個座標旋轉把它弄到橫軸上:可是這裡的 正是我們要求的啊……不過不要緊,我們可以用二分搜尋:第一次順時針旋轉 45 度,然後看新的座標給弄到橫軸的上面還是下面,如果在上面就順時針旋轉 22.5 度,在下面就逆時針。換言之,每次旋轉角度減半,這樣就能把點逐漸靠近橫軸了。而每次旋轉所用的三角函式值完全可以儲存在表格裡,用查表的方法得到。不過即使這樣我們仍然有大量的乘法運算(每次旋轉做了 4 次乘法),對矩陣稍作修改就可以得到:換言之每次旋轉的時候,為了保持點到原點距離不變我們乘以了一個係數 ,不過我們這裡只關心幅角不關心模,所以可以把它去掉(後果是變換時點會離原點越來越遠):這樣浮點乘法減少了兩次。然後我們還是不甘心,因為浮點乘法實在是太慢了,能不能把它徹底消除呢?實際上是可以的。在剛才的布驟裡我們每次旋轉角減半,實際上並不需要這麼做——我們可以選擇這樣一組特殊的角,就能讓每次旋轉中的乘法完全退化為加減法,這就可以大大簡化電路設計。當然 CORDIC 除了可以算 arctan,還有許多函式都可以計算,包括 sin、cos、tan 和模。

  • 中秋節和大豐收的關聯?
  • 你的初戀是誰說出分手的?