急!在线等,请各位高手帮我做这个题,谢谢。我实在是搞不明白。

时间:2022-06-12 18:42:14
某数值计算需要进行大量余弦函数cos(x)的运算,要求精确到0.001,请给出一个快速计算的算法。
不要求将程序写出来,但要将实现思路清晰表达,必要时可以辅以C语言的程序片段。

22 个解决方案

#1


是不是酱紫?角度转换弧度好像写的乱了 呵呵
const double PI 3.1411592653;
#include <math.h>

double  余弦值;
double 角度;
余弦值=cos(角度/180*PI);

#2


搞不懂楼主的意思。不知道C的数学函数库给出的算法是速度上满足不料你的要求还是精度上满足不了。

#3


我是做测试工作的,对编码是不行啊。可现在没办法,要面试。
从题目看可能是要讲究计算速度,请大虾给下答案吧,以前我都没看过这样的题目啊

#4


肯定嫌速度慢了.

瞎说一下:
cos做成宏.
pi位数尽量少点,满足精度就可以了
能用整数运算的地方就尽量用整数运算







#5


C的math.h中就有 double cos(double n)函数(n为弧度)
不明白楼主想要什么?

#6


回楼上的

上面的题目是公司的面试题,我也不知道怎么去答,所以来求大虾们,你们认为是什么,我个人觉得应该是速度与精度两方面满足即可。

那为大虾从速度与精度上来帮我写下编码,我实在搞不定,感激。

#7


就千分之一的精度,数学库里的cos早就够了,而且cos的算法已经是非常经典的算法了,在出现C语言以前就有成千上万的人去研究了;因此我认为C语言函数库的制作者们不可能不知道这些算法,而且他们是直接在汇编级别上做代码调试和优化的,效率不可能低。

即使某些人绞尽脑汁想出一个比现行算法更快的来,那么他用C语言写的代码也不会比源库提供的效率高出多少;如果自己有能力在汇编下作优化,那么也许会有较大提升,不过我想:为了一个简单的测试,而花这么恐怖的时间去搞一个小小的cos,是不是开销太大了?

#8



数学库里的cos精度比较高;所以自己写个精度低一点的宏,精度低了,运算量也就低了,肯定可以快过库里的。

#9


哈,降低精度,我怎么没想到呢?看来还是小弟我太年轻了。
如果单纯是为测试而提速,那么我认为查表最快。具体实现如下:

事先把arccos(-1),arccos(-0.9995),arccos(0.9985),arccos(0.9975),...,arccos(0.9985),arccos(0.9995),arccos(1)算一遍,做成一个数组(或其他什么形式的表)。
对于任意一个 x ,先对2*PI取模(因为浮点数没有取模运算,可用连续减2*PI来实现),结果如果大于PI,则用2*PI,去减它,然后查表,若位于某个arccos(x),arccos(x+0.001)之间则其cos值为x+0.0005.

#10


楼上的高人,你能不能把你的思想用CODE下来,我来调试看是否可能行。多谢你啊,感激啊。

#11


:(
这年头最烦写代码,再说了,这也不算什么东西吧?是个程序员(或者说刚开始学C)就可以编写这种低级代码吧?无非就是个查表算法,自己动手去写吧。
再说了,用什么数据结构我也不清楚啊,主要是因为不清楚你的需要。

#12


呵呵  有学过高数?还记得麦克劳林展开式?
用这个可以自己算cos的值 还可以规定精度!

#13


cos(x) = 1 - x*x/2! + x*x*x/3! - x*x*x*x/4! +.......+(-1)的(m+1)次方*x的2m次方/2m!
余项就是误差 只要误差小于你指定的一个数就可以得出要算到多少项了。

#14


如果楼主不想自己算的话,我乐意提供arccos(-0.9995)到arccos(0.9995)共计2000个数据,你可以自己再加进arccos(-1), arccos(1)两个数据(其实也许再最后加一个arccos(1)就够了)就可以实现我上面的算法了。

注意:我提供的数列第i项的cos值为 (i-1000)-0.0005

(晕,说我回复内容过长,贴不上去,算了,你需要的话我直接打包发给你,并请指明精度要求)

#15


谢谢大虾们啊。
我的精度只要如题0.001即可。
你发给我一下吧。今天晚上好吗,我明天就要用了
EMAIL:joezbp@21cn.com
感谢

#16


LINUX系统内核学习交流QQ群
群号:22225129(日日日日我要日久(好记不))
快加入我们吧!

#17


邮件发了, 不知道是否迟了.

#18


多谢crazy_lazy_pig(疯狂懒猪),感激。我现在那个用户不知道密码,给不了你分,下次补给你。

#19


这是用数学知识
就是循环结构

做测试的这都不知道
怎么测试阿

#20


泰勒公式(估计内部也这样实现的)
cos(x) = 1 - x*x/2! + x*x*x/3! - x*x*x*x/4! +.......+(-1)的(m+1)次方*x的2m次方/2m!

static float coses[360] ={查表把值填到这里......};
把内容计算好,直接
这样用
cos(x) = coses[x%360];

#21


呵呵, 楼主真逗, 就五分而已, 慢慢给好了.
下次要算什么数了, 可以再找我, 算这几个数还是轻松的很.

#22


楼上是活雷锋   鉴定完毕……

呵呵

#1


是不是酱紫?角度转换弧度好像写的乱了 呵呵
const double PI 3.1411592653;
#include <math.h>

double  余弦值;
double 角度;
余弦值=cos(角度/180*PI);

#2


搞不懂楼主的意思。不知道C的数学函数库给出的算法是速度上满足不料你的要求还是精度上满足不了。

#3


我是做测试工作的,对编码是不行啊。可现在没办法,要面试。
从题目看可能是要讲究计算速度,请大虾给下答案吧,以前我都没看过这样的题目啊

#4


肯定嫌速度慢了.

瞎说一下:
cos做成宏.
pi位数尽量少点,满足精度就可以了
能用整数运算的地方就尽量用整数运算







#5


C的math.h中就有 double cos(double n)函数(n为弧度)
不明白楼主想要什么?

#6


回楼上的

上面的题目是公司的面试题,我也不知道怎么去答,所以来求大虾们,你们认为是什么,我个人觉得应该是速度与精度两方面满足即可。

那为大虾从速度与精度上来帮我写下编码,我实在搞不定,感激。

#7


就千分之一的精度,数学库里的cos早就够了,而且cos的算法已经是非常经典的算法了,在出现C语言以前就有成千上万的人去研究了;因此我认为C语言函数库的制作者们不可能不知道这些算法,而且他们是直接在汇编级别上做代码调试和优化的,效率不可能低。

即使某些人绞尽脑汁想出一个比现行算法更快的来,那么他用C语言写的代码也不会比源库提供的效率高出多少;如果自己有能力在汇编下作优化,那么也许会有较大提升,不过我想:为了一个简单的测试,而花这么恐怖的时间去搞一个小小的cos,是不是开销太大了?

#8



数学库里的cos精度比较高;所以自己写个精度低一点的宏,精度低了,运算量也就低了,肯定可以快过库里的。

#9


哈,降低精度,我怎么没想到呢?看来还是小弟我太年轻了。
如果单纯是为测试而提速,那么我认为查表最快。具体实现如下:

事先把arccos(-1),arccos(-0.9995),arccos(0.9985),arccos(0.9975),...,arccos(0.9985),arccos(0.9995),arccos(1)算一遍,做成一个数组(或其他什么形式的表)。
对于任意一个 x ,先对2*PI取模(因为浮点数没有取模运算,可用连续减2*PI来实现),结果如果大于PI,则用2*PI,去减它,然后查表,若位于某个arccos(x),arccos(x+0.001)之间则其cos值为x+0.0005.

#10


楼上的高人,你能不能把你的思想用CODE下来,我来调试看是否可能行。多谢你啊,感激啊。

#11


:(
这年头最烦写代码,再说了,这也不算什么东西吧?是个程序员(或者说刚开始学C)就可以编写这种低级代码吧?无非就是个查表算法,自己动手去写吧。
再说了,用什么数据结构我也不清楚啊,主要是因为不清楚你的需要。

#12


呵呵  有学过高数?还记得麦克劳林展开式?
用这个可以自己算cos的值 还可以规定精度!

#13


cos(x) = 1 - x*x/2! + x*x*x/3! - x*x*x*x/4! +.......+(-1)的(m+1)次方*x的2m次方/2m!
余项就是误差 只要误差小于你指定的一个数就可以得出要算到多少项了。

#14


如果楼主不想自己算的话,我乐意提供arccos(-0.9995)到arccos(0.9995)共计2000个数据,你可以自己再加进arccos(-1), arccos(1)两个数据(其实也许再最后加一个arccos(1)就够了)就可以实现我上面的算法了。

注意:我提供的数列第i项的cos值为 (i-1000)-0.0005

(晕,说我回复内容过长,贴不上去,算了,你需要的话我直接打包发给你,并请指明精度要求)

#15


谢谢大虾们啊。
我的精度只要如题0.001即可。
你发给我一下吧。今天晚上好吗,我明天就要用了
EMAIL:joezbp@21cn.com
感谢

#16


LINUX系统内核学习交流QQ群
群号:22225129(日日日日我要日久(好记不))
快加入我们吧!

#17


邮件发了, 不知道是否迟了.

#18


多谢crazy_lazy_pig(疯狂懒猪),感激。我现在那个用户不知道密码,给不了你分,下次补给你。

#19


这是用数学知识
就是循环结构

做测试的这都不知道
怎么测试阿

#20


泰勒公式(估计内部也这样实现的)
cos(x) = 1 - x*x/2! + x*x*x/3! - x*x*x*x/4! +.......+(-1)的(m+1)次方*x的2m次方/2m!

static float coses[360] ={查表把值填到这里......};
把内容计算好,直接
这样用
cos(x) = coses[x%360];

#21


呵呵, 楼主真逗, 就五分而已, 慢慢给好了.
下次要算什么数了, 可以再找我, 算这几个数还是轻松的很.

#22


楼上是活雷锋   鉴定完毕……

呵呵