个人资料
  • 博客访问:
正文

从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)
评论
目前还没有任何评论
登录后才可评论.