tibuko经常敲三打四,基本上都是无的放矢,从计算M2供应量到点评计算机,大炮放了不少,可惜没一个不打偏的,
刚刚上网,看到 替补裤 抛了个绣球:
都是CS牛人,写个sin函数怎么搞?
• 不管你怎么算,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 结果,非常快,非常准: