Lua can’t do math?

September 17, 2009

今天把项目中所有使用的脚本从python替换到lua,一切看起来很美,不过最后测试的时候发现一个非常诡异的问题,具体lua语句如下:

print("simple test: ")
print((10000 + 123456789) - 123456789)

程序打印出来的值竟然是10003,顿时被雷到了。虽然我知道lua用的是double作为基础的lua_number,但是人家已经很耐心的教育我们double是双精度类型,不会出现什么四舍五入的问题。于是打开linux上的终端运行lua进行同样的计算,这次得到的是正确的结果:10000。

想想也知道lua不会有这种低级的错误的,要不还不立刻被人骂死,于是开始找自己的问题,首先怀疑是我们的lua嵌入包裹代码的问题,仔细review了一遍代码,觉得不会影响到这么底层的问题。接着开始做实验,发现在服务器上的同样lua代码,运行的结果是正确的。经过无尽的折腾,最后发现了这么一个事实:

在directX的sdk文档里面,D3DCREATE这个条目里面有这么一条:

D3DCREATE_FPU_PRESERVE Set the precision for Direct3D floating-point calculations to the precision used by the calling thread. If you do not specify this flag, Direct3D defaults to single-precision round-to-nearest mode for two reasons:
- Double-precision mode will reduce Direct3D performance.
- Portions of Direct3D assume floating-point unit exceptions are masked; unmasking these exceptions may result in undefined behavior

D3D默认在创建设备的时候,会把双精度改成单精度,增加渲染的效率,所以lua也被殃及了,这也算是蝴蝶效应的一个体现吧。。。。。

恶心的问题只要原因找到了解决总是相对容易的,现在有两个方案:

  1. 将lua_number定义为int,缺点是lua内就不能使用小数
  2. 在D3D初始化的时候添加参数,让他不要改变计算精度,缺点是不知道对性能有多大影响

Get rid of memory bugs

August 30, 2009

大型的C/C++程序做到最后,bug高发的时期过去之后,一般来说会出现的问题都是很妖的。最最常见的现象就是一下几种:

  1. 调用栈全部混乱,一堆问号出现在这里,你明明知道自己编译的时候有放入符号,现在却什么信息都看不到
  2. 莫名其妙的调用了一个代码里面没有调用的函数
  3. 重复的free或者delete某块内存,然后崩溃
  4. 部分静态或者全局的数据混乱了,代码里面除了初始化就没啥地方写过他们了
  5. 莫名的某个对象的数据全部混乱了

Continue Reading »

Test Live writer 2009

January 9, 2009

同事帮我画的两张卡通头像,谢谢gary同学~

head1_by_gary head2_by_gary

Fix IBus Openoffic and Awesome

December 31, 2008

Add following line to soffice start script

# IBUS was confilict with OOO3 under awesomedon’t know why, but add the blow  
# line, everything OK then~ cheers

OOO_FORCE_DESKTOP=gnome export OOO_FORCE_DESKTOP 

 
Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org