| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2166 人关注过本帖
标题:求助一道关于阶乘的题
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
验算了一下,你这个题目的要求不合理。当限制收敛项的精度时,如果给出较大的弧度值,则结果的偏差很大,会出现余弦绝对值大于1的情况,这是不合理的。修正精度,限制级数项为80,则在x<24时有很好的正确值(在指定小数点后6位数的条件下),超过24,逐渐出错,但没第一种那么离谱。不过,VFP自身的库函数COS()不会出错。但是,在0-360度的范围内,本级数算法在n=10之内已经收敛到足够的精度(小数点后18位)。

按1楼的叙述,如果1E-6作精确到小数点后6位数理解的话,那是没意义的,因为这种精确度必须跟真值对比,能有真值,也不用这么算了,因此无法作那种理解。

作数学运算:令x=24,n=10,对最后一项,x^2n=4.02E27,20!=2.43E18,分子比分母大了9个数量级,说明这个级数的尾项不是递减的。

第一种算法,应该作修正:如果得到结果(绝对值)大于1,那么就多算一项,可能会有点效果。没时间了,你自己研究吧。

[ 本帖最后由 TonyDeng 于 2011-12-14 03:22 编辑 ]

授人以渔,不授人以鱼。
2011-12-14 02:57
Tiger5392
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:88
帖 子:2775
专家分:2237
注 册:2006-5-17
收藏
得分:0 
首先,你把输入的弧度数x变成[0,2*pi()]之间的值,y=x-int(x/pi()/2)*2*pi()
其次,精确到1e-6的数,必须用前后两个计算结果比较,其差小于该值即可。
特别注意:假如你是为了练习编写程序,上述处理是合适的;若想投入应用,VFP有COS()内部函数,就不劳你动手了

感言:学以致用。 博客:http://www./blog/user14/65009/index.shtml email:Tiger5392@
2011-12-14 11:55
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
最终版本,对任何输入数字均有效:

程序代码:
*-----------------------------------
*     题目:运用级数收敛求余弦值
* 级数公式:Cos(x) = 1 - x^2 / 2! + x^4 / 4! - ……+ (-1)^n·x^2n / (2n)!
*     备注:因VFP有指数运算符^,所以无需自编幂运算函数
*-----------------------------------
SET DECIMALS TO 18
CLEAR
Input "请输入弧度值 x = " TO x
nAngle = MOD(x, 2 * PI())            && 将输入的弧度值调整到2π以内
nCosine = 0.0                        && 余弦初值
nSign = 1                            && 正负号
FOR nIndex = 0 TO 10                && 10项级数收敛足够精度了
    nCosine = nCosine + nSign * nAngle^(2 * nIndex) / Factorial(2 * nIndex)
    nSign = - nSign
NEXT
? "Cos(" + STR(x, 6, 4) + ") = " + STR(nCosine, 20, 18)
? "计算机真值 = ", COS(x)
RETURN 

* 求自然数n的阶乘
FUNCTION Factorial(n AS Integer) AS Long
    LOCAL nIndex AS Integer
    LOCAL nReturnVal AS Long
   
    * 如果n是数值型数据且大于等于零则进行运算,否则返回零(正常阶乘值不会等于零的)
    IF (VARTYPE(n) == "N") .AND. (n >= 0)
        nReturnVal = 1
        FOR nIndex = 1 TO n
            nReturnVal = nReturnVal * nIndex
        NEXT
    ELSE
        nReturnVal = 0
    ENDIF
   
    * 将计算结果返回到调用处
    RETURN nReturnVal
   
ENDFUNC


授人以渔,不授人以鱼。
2011-12-14 17:31
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
函数Factorial()现在可以作为你的库函数使用,对前面两道题,关注每一项的累加就可以了,无需再操心n!的代码,正如不必操心平方根一样(使用函数sqrt())。学编程,学的就是把这样的有价值代码分离出来,再组装,而不是满眼的循环、判断、所有功能的代码混杂在一起。这个程序本身也可以抽象为一个独立的函数。

授人以渔,不授人以鱼。
2011-12-14 17:48
qingfameng
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:35
帖 子:964
专家分:3019
注 册:2010-2-6
收藏
得分:5 
(回1楼主)哈. 匆匆忙。 1 看成 小写 L 啦。没再把 e 看成大写。见笑啦!


2011-12-14 21:16
快速回复:求助一道关于阶乘的题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025081 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved