找回密码
 立即注册

QQ登录

只需一步,快速开始

Leo

超级版主

20

主题

493

帖子

1073

积分

超级版主

Rank: 8Rank: 8

积分
1073

活字格认证微信认证勋章元老葡萄

Leo
超级版主   /  发表于:2014-5-13 14:14  /   查看:6795  /  回复:5
来自系列三同样的一份作品,
  1. public static double sin( double x )
  2.     {
  3.         x = x % ( 2 * PI ) ;
  4.         double sum = 0 ;
  5.         for( int i = 1 ; i < 27 ; i = i + 2 )
  6.             sum += pow( -1 , i / 2 ) * pow( x , i ) / fact( i ) ;
  7.         return sum ;
  8.     }
  9. public static double pow( double x , double nPower )
  10.     {
  11.         if( x > 0.0 )
  12.             return exp( nPower * ln ( x ) ) ;
  13.         else if( fabs( x - 0.0 ) < 0.0000001 )
  14.             return 0.0 ;
  15.         else
  16.         {
  17.             if( nPower % 2 != 0 )
  18.                 return -1 * exp( nPower * ln( -1 * x ) ) ;
  19.             else
  20.                 return exp( nPower * ln( -1 * x ) ) ;
  21.         }
  22.     }
  23. public static double exp( double x )
  24.     {
  25.         double sum = 1 ;
  26.         for( int i = 1000 ; i > 0 ; i -- )
  27.         {
  28.             sum /= i ;
  29.             sum *= x ;
  30.             sum += 1 ;
  31.         }
  32.         return sum ;
  33.     }
复制代码


欢迎讨论。

5 个回复

倒序浏览
perftcc
中级会员   /  发表于:2014-5-13 23:39:00
沙发
怎么看见都是用java写的,难道除了我没人用c?
回复 使用道具 举报
Leo
超级版主   /  发表于:2014-5-14 08:54:00
板凳
有啊,入围复审的有三份C作品,貌似全部作品中,纯C语言的作品有10份左右,其他很多有用C++的。
C语言的作品,目前总体看最大的问题是错误处理。
回复 使用道具 举报
perftcc
中级会员   /  发表于:2014-5-15 08:51:00
地板
我的东西就是拿c写的,感觉精度和错误检测是两个很难啃的骨头,尤其是精度,后面实在没办法只能用double类型数据,然后精度就低的可怜了,,,
回复 使用道具 举报
Leo
超级版主   /  发表于:2014-5-15 08:53:00
5#
没有人点评?
那我来吧,这份作品尝试自己通过一些公式组合实现数值计算。
但是这里作者没有考虑一个问题,如果使用一个不精确的exp,计算出另一个不甚精确的POW,再拿来算三角函数,结果的误差可能会被放大无限倍。
这就是为什么经典的数值计算不会推荐你用乘方运算计算三角函数,而是使用展开式无限逼近的方法,以快速收敛和减少误差的放大。
回复 使用道具 举报
Leo
超级版主   /  发表于:2014-5-15 08:54:00
6#
另:
出题的时候我考虑再三,把反双曲函数从题目中干掉了,原因很简单,目前没有一个好的,快速收敛的展开式可以计算反双曲函数,所以,我计算了一下时间,把这个复杂度摘掉了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部