加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

[原创]C语言中幂函数如果使用“x^n”……

(2013-12-21 00:33:19)
标签:

c语言

幂函数

数值计算

perl

括号配对

分类: 想法观点
[原创]网络转载敬请注明作者felonwan和出处,其它出版计划请联系作者。

C/C++效率高,用来做系统底层的设计无疑是很好的,但是现在也有很多人用来做数值计算。
不过其中有很多东西C/C++并没有为数值计算优化。最简单的,比如:幂函数居然要写成pow(x,n)这样比较复杂的形式,如果使用x^n更符合直觉,更易用;复杂一点的,Fortran里有对矩阵的操作块的操作,C/C++里只能一个数一个数地操作。

如果能做一个编译器级别的改变肯定是最好的,引入一些对于数值计算更易用的语法,再引入一些数值计算库,或许可以开发一个C数值计算的变种。不过这个事笔者目前是没有这能力。如果有人有能力而且感兴趣,不妨建个开源项目什么的。

易学易用是重要的一方面,但是功能的强大、方便扩展无疑更重要。如果这个C/C++的分支相对于原始C/C++及其它科学计算语言来说没有很大的优势,肯定做不起来,不如不做!目前Fortran做数值计算就比C易学易用一些;科学计算的库,也已经有很多了,有类似matlab矩阵操作的库函数,有符号计算的库;matlab、mathematica这样的脚本语言很成熟,易用扩展性强;结合C和python脚本的scipy和numpy这样的科学计算平台做得也很好,用的人不少。

这里,我们做了一点小东西,就是不改变标准C语法,只是写程序的时候:用$表示标准C语言中的按位异或,用^表示乘方,然后在预处理的时候再转换回去。(这种事情意义不大,如果能成为标准才有意义)

下面是把“x^n”转变成“pow(x,n)”的Perl脚本,考虑了各种可能的情况:
#!/usr/bin/perl

# dynamic regexp
my $levelN;
$levelN = qr/ (?> [^()]+ | \( (??{ $levelN }) \) )* /x;

# open file, do the replacement and print to screen.
if(open(FH,@ARGV[0])){
  while(){
    my $line=$_;
    my $line1=$line;
    while(1){
      $line1=~ s/(\($levelN\))\s*\^\s*(\($levelN\))/pow($1,$2)/g; #(a+b)^(c+d)
      if("$line1" eq "$line"){last;}
      $line=$line1;
    }
    while(1){
      $line1=~ s/(\w*\.*\w*)\s*\^\s*(\($levelN\))/pow($1,$2)/g; #a^(b+c)
      if("$line1" eq "$line"){last;}
      $line=$line1;
    }
    while(1){
      $line1=~ s/(\($levelN\))\s*\^\s*(\w*\.*\w*)/pow($1,$2)/g; #(a+b)^c
      if("$line1" eq "$line"){last;}
      $line=$line1;
    }
    while(1){
      $line1=~ s/(\w*\.*\w*)\s*\^\s*(\w*\.*\w)/pow($1,$2)/g; #a^b
      if("$line1" eq "$line"){last;}
      $line=$line1;
    }
    print "$line1"
  }
  close(FH);
}
else{
  print "Error: Open FILE '@ARGV[0]' fail!\n"
}

用法:./topow.pl filename.c >newname.c

有小缺点:括号不能去掉;代码里面4种不同类型的字符替换代码重复度高、顺序不能变
第一次写的perl脚本,花了半天的时候边学边写。对于正则表达式了解不多,所以只能这样了,凑合能用,如果高手能指点再简化一下就更完美了。

另外可以参考相关讨论和网友zhao4zhong1的C语言版本源代码:http://bbs.csdn.net/topics/390671469

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有