博文

目前显示的是 五月, 2006的博文

舍入误差

我在用昨天我写的方式计算sqrt(a)
3阶迭代,在使用默认精度的情况下,由于舍入误差发生了发散的现象
迭代次数: 8
计算结果: 1409.19673578662854171
相对误差: 0.000180436417557990604922
迭代次数: 9
计算结果: 1408.94251124942256652
相对误差: 1.4682332404908543661e-12
迭代次数: 10
计算结果: 1408.94251124735391024
相对误差: -3.81679361123628071732e-20
迭代次数: 11
计算结果: 1408.94251124735391029
相对误差: -2.19311729677891129927e-21
迭代次数: 12
计算结果: 1408.94251124735391027
相对误差: -1.4505354752379816839e-20
当迭代次数大于等于8时,迅速收敛
然后就发生了一个很有趣的现象,15次以上的迭代的时候,使用2阶迭代要
比3阶能获得略微更高的精度。
当我换用1024位精度,采用3阶迭代进行计算时,情况发生了惊人的变化
迭代次数: 12
计算结果: 1408.942511247353910289820207953231236078
相对误差: -3.691499193715134110660858656096332961862e-309
采用默认精度的情况下,上次的迭代误差是在e-20级别

导致我声卡罢工的驱动找到了

Microsoft WINMM WDM Audio Compatibility Driver
system32\drivers\wdmaud.sys
这个驱动加载失败
但是我不知道该怎么办

话说const

const在C语言中算是一个比较新的描述符,我们称之为常量修饰符,意即其所修饰的对象为常量(immutable)。下面我们来分情况看语法上它该如何被使用。函数体内修饰局部变量例:voidfunc(){ constint a=0; } 首先,我们先把const这个单词忽略不看,那么a是一个int类型的局部自动变量,
我们给它赋予初始值0。
然后再看const.
const作为一个类型限定词,和int有相同的地位。constint a; intconst a; 是等价的。于是此处我们一定要清晰的明白,const修饰的对象是谁,是a,和int没
有关系。const 要求他所修饰的对象为常量,不可被改变,不可被赋值,不可作为
左值(l-value)。
这样的写法也是错误的。constint a; a=0; 这是一个很常见的使用方式:constdouble pi=3.14; 在程序的后面如果企图对pi再次赋值或者修改就会出错。
然后看一个稍微复杂的例子。constint* p; 还是先去掉const 修饰符号。
注意,下面两个是等价的。int* p; int *p; 其实我们想要说的是,*p是int类型。那么显然,p就是指向int的指针。
同理constint* p; 其实等价于constint(*p); intconst(*p); 即,*p是常量。也就是说,p指向的数据是常量。
于是p+=8; //合法 *p=3; //非法,p指向的数据是常量。那么如何声明一个自身是常量指针呢?方法是让const尽可能的靠近p;int* const p; const右面只有p,显然,它修饰的是p,说明p不可被更改。然后把const去掉,可以
看出p是一个指向 int形式变量的指针。
于是p+=8; //非法 *p=3; //合法再看一个更复杂的例子,它是上面二者的综合constint* const p; 说明p自己是常量,且p指向的变量也是常量。
于是p+=8; //非法 *p=3; //非法const 还有一个作用就是用于修饰常量静态字符串。
例如:constchar* name="David"; 如果没有const,我们可能会在后面有意无意的写name[4]='x'这样的语句,这样会
导致对只读内存区域的赋值,然后程序会立刻异常终止。有了 const,这个错误就
能在程序被编译…

[技巧]修改FreeBSD的启动标志

从6.0起,FreeBSD的老Logo已经被换下而新Logo还没有被换上。于是在启动到boot2的时候(就是让你选择是普通启动还是单用户模式还是 reboot的时候),右侧那个可爱的小精灵不见了
我研究了下它的源代码,发现
在 /boot/loader.conf 中加入
loader_logo="beastie"
就可以了。
可选的参数有,fbsdbw(默认),beastiebw(彩色beastie),beastie(黑白beastie),none(没有).
呵呵,其实类似的还有很多这种暗藏的选项,在/boot/defaults/loader.conf 中都没有说明。可怜啊,它的启动脚本用的是一种非常古怪的语言,期待有能看懂它的给写一个比较完整的文档。

关于ln2

今天我在读刚借的《数值实验》,黄友谦编,高教版。
上面第一个例子就是计算ln2,采用方式是把ln(1+x)在0处泰勒展开,也就是麦克劳林展开,然后让x等于1。
书上的例子是为了阐述舍入误差,他说他采用的是10位10进制的计算机上算的,my god.我不懂。
首先,我用bc算ln2的精确值,在保留100位精度的情况下
ln2=0.6931471805599453094172321214581765680755001343602552541206800094933936219696947156058633269964186875
然后我在我的机子上写了个很小的程序#include <iostream>#include <cmath>intmain(int argc,char* argv[]){ typedefdouble T; long n=strtol(argv[1],NULL,10); n++; T sum(0); for(int i=1;i!=n;++i) if(i%2) sum+=static_cast<T>(1)/i; else sum-=static_cast<T>(1)/i; std::cout<<sum<<std::endl; std::cout<<"实际误差:"<<log(2)-sum<<std::endl; std::cout<<"理论最大误差:"<<(1.0/n)<<std::endl; return0; } 发现误差与理论值有惊人的相似。
n等于5000的时候,误差0.00998
$ ./ln2 5000
0.693247
n等于50000的时候,误差0.00098
$ ./ln2 50000
0.693157
我把计算过程中的double换成了float,结果依旧,不知道是不是因为发生了类型提升所以和原来的代码其实是一样的。迭代次数
计算值
绝对误差
理论最大误差
150.725372-0.03222470.0588235
24
0.672747
0.0203997
0.0384615
64
0.6…

求高手帮忙解决声卡问题

系统为xp,控制面板-〉声音和音频设备 中找不到可用设备。于是,无声,只有主板响。问题出现在我反复的添加删除声卡反复的重装声卡驱动后。我有3块声卡,2 PCI,1主板集成(nv,ac97)1。已安装正确的驱动,且可保证没有硬件问题等,声卡在freebsd下使用正常2。设备管理器里显示为“驱动程序已启用但尚未开始使用”3。dxdiag中DirectSound 测试结果: 步骤 3 (DirectSoundCreate) 上有故障: HRESULT = 0x88780078 (没有驱动程序)4。dxdiag中音乐栏没有硬件加速器5。设备管理器->系统设备里“plug and play software device emumerator"存在,且正常。6。重新安装了最新的dx9.0c,问题依旧。反复重新安装主板、声卡驱动,问题依旧。7。出现问题后发现,HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32中aux/wav/mid的键的项目已满(从0到9),多余的我已清空,但是问题依旧。8。ntbtlog.txt中显示所有声卡驱动已经正常加载9。windows audio服务正常运行我已经在google group翻了近100篇相关的帖子,试了很多方法问题依然没有解决。我不想重装,我想亲手找到问题的原因所在。

又可以上spaces了,庆贺一下

呵呵
live.com被江苏电信解封了

DDE与Serialization,GUI设计中的三层结构

最近我正在用wxWidget做一个主成分分析的程序。wxWidget我只用过不多几次,唯一的感觉就是和MFC太像了。这个程序的主UI部分是一个data Grid。我初始的做法是直接在需要读取数据的时候从这个widget中读字符串然后转换,计算完毕后再转换为字符串输出。第二次的时候,我改变了做法。我把原来的处理函数分为3部分,数据处理、TransferDataFromWindow、TransferDataToWindow。这样的代价是多用了2个循环降低了效率,并为this增加了一个成员变量,好处是程序结构一下子就变得特别清晰。我发现这有点类似于网页设计,努力将数据显示与数据本身相分离。它使得一部分程序员可以专注于GUI设计或数据处理。负责数据处理的程序员可以完全不知道这个程序是否有GUI,而负责GUI设计的可以完全不懂算法。这大概就是软件工程上常说的,降低耦合性。在使用DDE之前我主要的犹豫就是如果这样,那么我必须为每个控件增加一个成员变量以把数据binding上去。这就引起了一个问题,什么时候应该增加成员变量?增加一个成员变量,可以使得成员函数少一个参数,数据在成员函数中传递起来更简洁,但是同时,成员变量与全局变量一样,是魔鬼。它的生命周期太长,以至于我们总是怀疑它现在是否正处在正确的状态。在GUI设计中,这个原则可以被简述之,成员变量的使用须遵守最少化原则,成员变量仅仅是用来保存该实例的状态。如果该数据不需要在两个状态之间传递,那么就应该存储在类体中。例如。窗体不断刷新,没有接到任何信号,这是一个状态。button1按下并处理这个事件的时候这又是一个状态,button2按下并处理这个事件的时候这又是一个状态,如果一个变量需要从一个事件传递到另一个事件,那么,就需要设置为成员变量,反之,不需要。(fp的一个原则就是尽量不使用mutable variable,但是fp的一个缺点也是状态机实现起来很复杂。)类似于Java程序员常论的MVC,我们也可以把GUI分成三层,显示层,数据层,持久化层。显示层/数据层
即我们常说的document/view,文档视图模型,中间靠DDE进行连接。而数据层/持久化层,it's none of GUI
programmer's bussiness.如果不采用文档视图的方式,那么如果要将窗体中的数据持久化,简直是恶梦。DDE…

字符转换

今天开始写那个主成分分析的程序。
GUI采用wxWidget。内部用unicode编码。
本来我准备用gmp作高精度库的,但是我重装了系统换了vc8,然后才发现gmp根本就不支持win,以前的那个,是我在一个网友的基础上,在vc71下hack的gmp4.1,gmp最新的版本是4.2.要我重新hack一次吗?算了,没时间。于是找啊找,就用了NTL.NTL编译后居然有80多M,真大。NTL的一个缺点是输入输出接口的匮乏,只支持从iostream读入、输出。还有就是有几个全局函数是在指定的精度下对char*做输入输出。共同的缺点就是不支持wchar_t.然后今天就陷入字符转换的hell中了。昨天有人在smth上问如何把数字转换为字符串,这原本不是问题的一个问题,其实后面复杂着呢。要想做正确的转换,就必须依赖于locale,然后……然后……hell啊~同样,从wchar_t*到char*的转换也是,必须依赖于locale.我本来不想转,我觉得无非就是指针嘛。wxString内部用的是unicode(not
utf8!!!),uft8和ascii是兼容的,反正我只处理数字,还转它做什么。于是就没有理会。结果是运行很正常。我输入几个整数,计算下平均值和方差,oh,yeah! 一切都对。可是当我计算实际数据的时候,发现精度丢失。求和的结果是整数。我很纳闷……后来发现精度问题居然是发生在了字符转换上。由于wchar_t是双字节,原来的"ab"这样的字符串在wchar_t的存储下就是"a.b.",然后我没有注意。其实每次从stream中把字符串输入的时候我只输入了第一个字符,第二个字符因为是0所以后面的都被略掉了。我刚开始的测试数据恰好都是单位的整数,所以就没有发现。类似的错误还有,在locale未设置或者设置错误的情况下,做字符转换的时候,通常第一个字符会被转错,然后后面的字符都是正确的。很常见的例子就是在菜单栏或者其它的地方我们常会看见这样的一些字符串,它的第一个字是乱码,但是后面的都是正常显示的中文字符。然后我自己写了个转换函数,就好了。当然,问题还没有完,我计算出的结果,和maple的结果,和excel的计算结果,相差甚大。我和maple的比较接近。我无法确定问题是出在了精度上还是我的算法还有错误。我觉得两者的可能性都不大。因为我的精度肯定…

Maple的麻烦

输入导入功能基本没有
如果要输入一个矩阵只能一个个字符的往里面敲
数据导出功能太弱
我今天试了N种格式都不行,花了
导出简单的表达式可以,字稍微多些就不行了……
最佳的格式是tex
用latex/pdflatex 生出来 dvi/pdf 居然……居然因为表达式太长页面没有表达式长
而……而不显示多余了的。没有办法让它显示出来……
郁闷。
我调整页面,调a3,a4纸张都不行。
最后一招,latex2html,哎……郁闷哦....

谷歌消失了?

传说中谷歌消失了,不过我也只是在新闻图片上见过它,每次去google 的时候,都没在意这个。可能是因为我一般都是用的english version的google吧。
这名字挺难让人接受的,不过听久了就顺耳了,我觉得还可以。
堂堂google,总不能注册个商标叫"狗狗"吧,不现实。谷歌很不错,就是啊,让人暂时难以接受。
不说了,既然已经撤下,难有再换上之理

huffman编码

典型的,精妙,但是难以维护的代码。
这里有memory leakage吗?
我说没有,你信吗?
哈哈!!!#include <iostream>#include <list>#include <algorithm>#include <vector>#include <iterator>struct Node{ Node *parent,*children,*next; void* data; }; struct prob_compare:std::binary_function<Node*,Node*,bool >{ booloperator( )( first_argument_type a, second_argument_type b ){ // std::cout<<"a:"<<*(reinterpret_cast<double*>(a->data))<<std::endl;// std::cout<<"b:"<<*(reinterpret_cast<double*>(b->data))<<std::endl;return (result_type) ( *(reinterpret_cast<double*>(b->data)) > *(reinterpret_cast<double*>(a->data))); } }; ///将probs数组中的内容,按照n进制huffman编码///返回值中,每个std::vector<CodedType>是一个码字的编码template <typename ProbabilityType //每个码字所对应的概率的类型 ,typename CodedType> //码字的类型,它的有效值范围从0到n-1std::vector<std::vector<CodedType&…

想抽空整理下cn.comp.lang.c

准备把去年的FAQs草稿整理下重写
但是是因为没有什么材料所以只好自己胡诌,半年过去了,多多少少也有不少帖子了,整理下出个正式点的FAQs
正在犹豫用什么格式写,latex还是xml+xslt
xml+xslt的好处是编写方便效率高,最终结果可以是txt,html,rtf,pdf,而且格式都正确,不会乱。
latex的优点是功能强大,但是在pdf下显示正常的东西在html下未必能正常显示,反之亦然。
xml易于长期保存,很多年后还可以方便的用程序处理,改为其它格式。
而latex就不行了,没有xml那么严谨的结构。
但是latex毕竟是latex,无可比!

auto_ptr

std::auto_ptr不可用于数组,切记,一定要切记。

fd与重定向

我们可以通过这样的方式来重定向,关闭fd 1,然后打开一个新文件。
那么原来写向stdout的东西,就会全部写到这个文件中。
即使是这样的在shell中重定向,也是无效的
cmd > result.txt
输出还是会写到我们打开的那个新文件中。int main(int argc,char* argv[]){ if(close(1) !=0 ){ ACE_ERROR_RETURN((LM_ERROR,ACE_TEXT("%p"),ACE_TEXT("close fd 1")),-1); } int fd=open("test.txt",O_RDWR|O_CREAT|O_TRUNC,S_IWUSR|S_IRUSR); if(fd==-1){ ACE_ERROR_RETURN((LM_ERROR,ACE_TEXT("%p"),ACE_TEXT("open new file")),-1); } std::cout<<"The fd of new file is:"<<fd<<std::endl; return 0; } 关闭fd 1后,不写
-r-x--s--- 1 snnn wheel 0B 5 2 12:08 test.txt
关闭fd 1后,写入
--wxr-x--- 1 snnn wheel 24B 5 2 12:03 test.txt
令人好奇的是这个权限位
后来我发现这个和是否关闭fd 1没有关系,问题在于我open new file的时
候添加了O_CREAT参数但是没有指定mode,于是,它可能越界读取了错误的
值作为mode.
关于open的mode的一些补充
传递给open的mode并不是实际最终的mode.它需要先和umask进行mask.
最终的mode为 ~umask & mode
例如,假如我的umask是022(默认),而传递给open的mode是
S_IWUSR|S_IWGRP,那么实际上S_IWGRP这个bit根本不会起作用。
关于fd的一些补充
进程刚开始的时候,首先要把locale设置为"C",然后打开3个fd,"0,1,2",
分别是stdin,stdout,s…

有的女人就像吸血鬼

对,吸血鬼。吸血鬼是什么样,她就是什么样。
我不是茅山来的,只懂得,在遇见会吃人的怪物时,要 “掉头疾走”!