tibuko經常敲三打四,基本上都是無的放矢,從計算M2供應量到點評計算機,大炮放了不少,可惜沒一個不打偏的,
剛剛上網,看到 替補褲 拋了個繡球:
• 不管你怎麽算,sin是有定義的,算得比這麻煩,那肯定不對 -avw- ♀ (0 bytes) (2 reads) 12/08/2022 postreply 11:35:36
• 非CS硬核,鑒定完畢 -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- ♂ (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值了,還算什麽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 結果,非常快,非常準: