個人資料
  • 博客訪問:
正文

從tibuko,看離散數學思維,和計算機思維

(2022-12-08 17:01:36) 下一個

tibuko經常敲三打四,基本上都是無的放矢,從計算M2供應量到點評計算機,大炮放了不少,可惜沒一個不打偏的,嘻嘻

剛剛上網,看到 替補褲 拋了個繡球:

都是CS牛人,寫個sin函數怎麽搞?

 
來源:  於 2022-12-08 11:17:20 [] [博客] [舊帖] [給我悄悄話] 本文已被閱讀: 1031 次 (0 bytes)

• 不管你怎麽算,sin是有定義的,算得比這麻煩,那肯定不對 -avw♀ 給 avw 發送悄悄話 avw 的個人群組 (0 bytes) (2 reads) 12/08/2022 postreply 11:35:36

• 非CS硬核,鑒定完畢 -tibuko♂ 給 tibuko 發送悄悄話 tibuko 的博客首頁 tibuko 的個人群組 (0 bytes) (1 reads) 12/08/2022 postreply 11:38:01

• 取決於performance和memory之間的tradeoff -兄貴♂ 給 兄貴 發送悄悄話 兄貴 的博客首頁 兄貴 的個人群組 (578 bytes) (13 reads) 12/08/2022 postreply 14:05:16

• 不錯,你已經有cos了,還導數個啥? -tibuko♂ 給 tibuko 發送悄悄話 tibuko 的博客首頁 tibuko 的個人群組 (0 bytes) (3 reads) 12/08/2022 postreply 15:12:02

• Cos 不是精確值,是迭代值。跟你沒法談了 -兄貴♂ 給 兄貴 發送悄悄話 兄貴 的博客首頁 兄貴 的個人群組 (0 bytes) (1 reads) 12/08/2022 postreply 15:30:13

• Recursion 聽說過沒? 有了和更有了,不是一回事 -兄貴♂ 給 兄貴 發送悄悄話 兄貴 的博客首頁 兄貴 的個人群組 (0 bytes) (0 reads) 12/08/2022 postreply 15:32:59

我接了一下:

取決於performance和memory之間的tradeoff -兄貴

如果是考慮memory,用最快收斂級數,比如構造一個比泰勒級數更快收斂的級數

如果是考慮performance, 用bucket / bigtable 裝下所有精度要求的sine值調用

兩者相結合,可以產生很多整合方法,比如 (1)級數展開不是在0點,而是在 bucket中的最接近的值附近,(2)因為sin的微分是cos,所以進行 slope iteration,通過sin,cos的迭代計算,快速算出;(3)可以用 spline 方法,(4)Smoothstep 方法,以及 Cordic 方法,,,等等

替補褲兄回答:

你已經有cos了,還導數個啥? -tibuko

這裏發現 替兄 確實沒有 離散數學思維和計算機思維,而是初等代數思維。沒學過離散數學的,一聽替兄所言 極是,都有cos值了,還算什麽sin呢?

離散數學有一個方法就是 induction,這是functional programming的基礎,recursive方法的基礎。這裏計算sin,隻是通過cos來逼近,因為 sin,cos 互為導數,下麵是我寫的計算的code,相對簡單,而且收斂非常好,大家可以試試,看能不能計算出你要的sin值:

float sin_at_x(float x)
{
    const float step = 0.000001; //這個可以調精度
 
    float a = 0.0;
    float cos = 1.0;
    float sin = 0.0;
 
    while(a<x) {
        sin += cos * step;;
        cos -= sin * step;
        a += step;
    }
    return sin;
}
 
上麵是用C++寫的草稿,下麵是用Python test 結果,非常快,非常準:
 
 
這個例子,說明 離散數學和 functional programming真的很重要
[ 打印 ]
閱讀 ()評論 (0)
評論
目前還沒有任何評論
登錄後才可評論.