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了,还导数个啥? -tibuko-
这里发现 替兄 确实没有 离散数学思维和计算机思维,而是初等代数思维。没学过离散数学的,一听替兄所言 极是,都有cos值了,还算什么sin呢?
离散数学有一个方法就是 induction,这是functional programming的基础,recursive方法的基础。这里计算sin,只是通过cos来逼近,因为 sin,cos 互为导数,下面是我写的计算的code,相对简单,而且收敛非常好,大家可以试试,看能不能计算出你要的sin值:
留着吓人不好吧。
前同事的儿子就是在CMU这样读的。
我不太懂CS, 也没太明白这个这个algorithm, 有点像用线性不断逼近的。 我的问题是,考虑到sin, cos 都是periodic function, 只需要计算x 在0 到2pi 之间的值。所以你这个程序是 O(1)的?
Game design就偏设计了。娃要是游戏迷想开发游戏倒是也不错。
兄贵是不是库珀的学生啊?
tibuko经常敲三打四,基本上都是无的放矢,从计算M2供应量到点评计算机,大炮放了不少,可惜没一个不打偏的,
刚刚上网,看到 替补裤 抛了个绣球:
都是CS牛人,写个sin函数怎么搞? 来源: tibuko 于 2022-12-08 11:17:20 [档案] [博客] [旧帖] [给我悄悄话] 本文已被阅读: 1031 次 (0 bytes)• 不管你怎么算,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了,还导数个啥? -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真的很重要留着吓人不好吧。
前同事的儿子就是在CMU这样读的。
我不太懂CS, 也没太明白这个这个algorithm, 有点像用线性不断逼近的。 我的问题是,考虑到sin, cos 都是periodic function, 只需要计算x 在0 到2pi 之间的值。所以你这个程序是 O(1)的?
Game design就偏设计了。娃要是游戏迷想开发游戏倒是也不错。
兄贵是不是库珀的学生啊?