灵感来自Quake 3中魔法数求平方根倒数的算法。求平方根的Delphi代码如下
function FastSQRT(X: Single): Single;
var
D1: DWORD;
D2: DWORD;
begin
D1 := $1FBA6C8E + PDWORD(@X)^ shr 1;
Result := PSingle(@D1)^;
Result := 0.5 * (Result + X / Result); // 一次迭代可达到万分之一精度级别
// Result := 0.5 * (Result + X / Result); // 二次迭代可达到千万分之一精度级别
end;
该算法巧妙利用了浮点数的二进制编码格式,利用整数运算快速找到一个非常接近最终解的迭代初始值,然后只需一次迭代运算即可达到较高的精度。上面代码中的Single类型就是C语言的float (32位)。