Objective c 计算两点之间距离的最快方法?
两点之间的距离:Objective c 计算两点之间距离的最快方法?,objective-c,math,optimization,euclidean-distance,Objective C,Math,Optimization,Euclidean Distance,两点之间的距离: sqrt((x1-x2)^2 + (y1-y2)^2) 有没有办法在objective-C中更快地完成这个数学运算 编辑:我想我需要澄清以上内容。我写上面的公式只是为了澄清我用什么公式来计算距离。^不是用来表示异或-我只是想表示数学公式,而不使用任何函数,如pow或任何东西,所以我想使用^来“提升到关闭电源”。我想知道是否有人知道使用位运算符或在汇编中编写代码是否会提供一个优化版本。我正在iPhone/iPad应用程序中使用该公式 double dist = sqrt ( p
sqrt((x1-x2)^2 + (y1-y2)^2)
有没有办法在objective-C中更快地完成这个数学运算
编辑:我想我需要澄清以上内容。我写上面的公式只是为了澄清我用什么公式来计算距离。^不是用来表示异或-我只是想表示数学公式,而不使用任何函数,如pow或任何东西,所以我想使用^来“提升到关闭电源”。我想知道是否有人知道使用位运算符或在汇编中编写代码是否会提供一个优化版本。我正在iPhone/iPad应用程序中使用该公式
double dist = sqrt ( pow((x1-x2), 2) + pow((y1-y2), 2) );
考虑到
x1、x2、y1、y2
是float
或double
或整数。否,如果您需要精确的距离,则无法超过该公式
尽管要清楚,^不是一个用于平方值的运算符,而是一个执行异或的位运算符
你需要像这样的东西
double dx = (x2-x1);
double dy = (y2-y1);
double dist = sqrt(dx*dx + dy*dy);
如果你可以只使用正方形(这在你只想按距离排序时很有用),你可以使用更有效的方法
double dx = (x2-x1);
double dy = (y2-y1);
double dist = dx*dx + dy*dy;
这些至少与解决方案pow一样好。最坏的情况下,pow()将使用堆栈,效率较低,但在这种情况下,您的编译器可能会将其转换为x*x。在Intel Mac Clang上编译:
double distance = ({double d1 = x1 - x2, d2 = y1 - y2; sqrt(d1 * d1 + d2 * d2); });
总共有6条数学指令:sub,mul,sub,mul,add,sqrt;很难做到这一点。(sqrt是一条指令,尽管它需要多个周期)。这里唯一可以改进的是平方根计算函数 我尝试了这两个函数(在a中找到)来计算近似的平方根值:
float fsqrt(float x)
{
float xhalf = 0.5f * x;
union
{
float x;
int i;
} u;
u.x = x;
u.i = 0x5f3759df - (u.i >> 1);
x *= u.x * (1.5f - xhalf * u.x * u.x);
return x;
}
float fsqrt2(float z)
{
union
{
int tmp;
float f;
} u;
u.f = z;
/*
* To justify the following code, prove that
*
* ((((val_int / 2^m) - b) / 2) + b) * 2^m = ((val_int - 2^m) / 2) + ((b + 1) / 2) * 2^m)
*
* where
*
* val_int = u.tmp
* b = exponent bias
* m = number of mantissa bits
*
* .
*/
u.tmp -= 1 << 23; /* Subtract 2^m. */
u.tmp >>= 1; /* Divide by 2. */
u.tmp += 1 << 29; /* Add ((b + 1) / 2) * 2^m. */
return u.f;
}
float fsqrt(float x)
{
浮点数xhalf=0.5f*x;
联盟
{
浮动x;
int i;
}u;
u、 x=x;
u、 i=0x5f3759df-(u.i>>1);
x*=u.x*(1.5f-xhalf*u.x*u.x);
返回x;
}
浮动fsqrt2(浮动z)
{
联盟
{
int tmp;
浮动f;
}u;
u、 f=z;
/*
*为了证明以下代码的合理性,请证明
*
*(((val_int-2^m)-b)/2)+b)*2^m=((val_int-2^m)/2)+((b+1)/2)*2^m)
*
*在哪里
*
*val_int=u.tmp
*b=指数偏差
*m=尾数位数
*
* .
*/
u、 tmp-=1>=1;/*除以2*/
u、 tmp+=1只是提供了一个简单、美观的解决方案。它很可能不会比以前给出的任何解决方案快,只是更短。我个人使用的是hypot
double dist = hypot((x1-x2), (y1-y2));
根据,这将返回“的平方根(x^2+y^2)”+1您可以肯定pow
所需的时间至少比*
长一个数量级,而且我认为编译器无法优化pow
,因为它无法确定它是否被一个名为pow
的完全不同的函数所取代。此外,hypop(dx,dy)
。我只是想知道是否有人知道执行此类计算的最快方法。通常我只会写出公式并使用pow或其他什么,但我不知道使用*、或按位运算符是否会产生更快的结果。我不认为通用幂函数(pow)计算平方比简单的乘法要快得多。