[原创]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])){
}
else{
}
用法:./topow.pl filename.c >newname.c
有小缺点:括号不能去掉;代码里面4种不同类型的字符替换代码重复度高、顺序不能变。
第一次写的perl脚本,花了半天的时候边学边写。对于正则表达式了解不多,所以只能这样了,凑合能用,如果高手能指点再简化一下就更完美了。
另外可以参考相关讨论和网友zhao4zhong1的C语言版本源代码:http://bbs.csdn.net/topics/390671469
前一篇:讨论