默认的FPU控制字令除法运算和PII/PIII上的平方根运算慢而精确,当无须得到这样的结果时,可用Set8087CW让FPU“偷懒”。 对于Single类型:Set8087CW(Default8087CW and $FCFF) 对于Double类型:Set8087CW((Default8087CW and $FCFF) or $0200) 对于extended类型:Set8087CW(Default8087CW or $0300)
多用Round
Trunc会读写FPU指令字,而Round不会,所以可以的话,尽量用Round。
传送实参
对于返回浮点值的函数,入口和出口处会有附加的压栈退栈,对形如: function func(x : SomeType): SomeFloat; 不妨改写为: procedure func(x : SomeType; var fp : SomeFloat); 对于在过程中未修改的浮点形参,没必要用const修饰,因为那除了增加一个编译期检查外,别无用处。相应的对策是用var修饰为实参,强制传址。
检查一个浮点数是否为零,如果简单的“Afloat=0”,会把0转换为浮点零。而更好的办法是这样: 对于Single类型:(Dword(pointer(Asingle))shl 1) =0 对于Double类型: type DoubleData=record lo,hi:Dword end; Var ADouble:Double; Dd:DoubleData absolute Adouble; begin … if ((dd.hi shl 1)+dd.lo)=0 then … end; 此法在PII上有30%-40%的效率提升。